Each MyISAM table is stored on disk in three
files. The files have names that begin with the table name and have
an extension to indicate the file type. An .frm
file stores the table format. The data file has an
.MYD (MYData) extension. The
index file has an .MYI
(MYIndex) extension.

To specify explicitly that you want a MyISAM
table, indicate that with an ENGINE table option:

CREATE TABLE t (i INT) ENGINE = MYISAM;

In MySQL 5.6, it is normally necessary to use
ENGINE to specify the MyISAM
storage engine because InnoDB is the default
engine.

All data values are stored with the low byte first. This makes
the data machine and operating system independent. The only
requirements for binary portability are that the machine uses
two's-complement signed integers and IEEE floating-point format.
These requirements are widely used among mainstream machines.
Binary compatibility might not be applicable to embedded
systems, which sometimes have peculiar processors.

There is no significant speed penalty for storing data low byte
first; the bytes in a table row normally are unaligned and it
takes little more processing to read an unaligned byte in order
than in reverse order. Also, the code in the server that fetches
column values is not time critical compared to other code.

All numeric key values are stored with the high byte first to
permit better index compression.

Large files (up to 63-bit file length) are supported on file
systems and operating systems that support large files.

There is a limit of
(232)2
(1.844E+19) rows in a MyISAM table.

The maximum number of indexes per MyISAM
table is 64.

The maximum number of columns per index is 16.

The maximum key length is 1000 bytes. This can also be changed
by changing the source and recompiling. For the case of a key
longer than 250 bytes, a larger key block size than the default
of 1024 bytes is used.

When rows are inserted in sorted order (as when you are using an
AUTO_INCREMENT column), the index tree is
split so that the high node only contains one key. This improves
space utilization in the index tree.

Internal handling of one AUTO_INCREMENT
column per table is supported. MyISAM
automatically updates this column for
INSERT and
UPDATE operations. This makes
AUTO_INCREMENT columns faster (at least 10%).
Values at the top of the sequence are not reused after being
deleted. (When an AUTO_INCREMENT column is
defined as the last column of a multiple-column index, reuse of
values deleted from the top of a sequence does occur.) The
AUTO_INCREMENT value can be reset with
ALTER TABLE or
myisamchk.

Dynamic-sized rows are much less fragmented when mixing deletes
with updates and inserts. This is done by automatically
combining adjacent deleted blocks and by extending blocks if the
next block is deleted.

MyISAM supports concurrent inserts: If a
table has no free blocks in the middle of the data file, you can
INSERT new rows into it at the
same time that other threads are reading from the table. A free
block can occur as a result of deleting rows or an update of a
dynamic length row with more data than its current contents.
When all free blocks are used up (filled in), future inserts
become concurrent again. See
Section 8.10.3, “Concurrent Inserts”.

There is a flag in the MyISAM index file that
indicates whether the table was closed correctly. If
mysqld is started with the
--myisam-recover-options option,
MyISAM tables are automatically checked when
opened, and are repaired if the table wasn't closed properly.