[+/-]
MyISAM
はデフォルトストレージエンジンです。古い
ISAM
コードに基づいていますが、便利な拡張子を多く持っています。(MySQL
5.1 は ISAM
をサポート
しない
事を覚えておいてください。)
各 MyISAM
テーブルはディスク上に3つのファイルとして保管されます。そのファイル名はテーブル名で始まり、ファイルタイプを指示する拡張子が付きます。.frm
ファイルはテーブルフォーマットを格納します。データファイルには
.MYD
(MYData
)
拡張子が付きます。インデックスファイルには
.MYI
(MYIndex
)
拡張子が付きます。
MyISAM
テーブルが必要だという事を明確に指示したい場合は、ENGINE
テーブルオプションを指定します。
CREATE TABLE t (i INT) ENGINE = MYISAM;
通常、MyISAM
ストレージエンジンを指示するのにENGINE
を使用する必要はありません。変更されない限り、MyISAM
がデフォルトエンジンです。デフォルトが変更されている可能性がある場合に
MyISAM
を確実に利用する為には、ENGINE
オプションを確実に包括してください。
mysqlcheck クライアントか
myisamchk
ユーティリティでMyISAM
テーブルをチェックしたり、修正したりする事ができます。容量を節約する為にmyisampackを使って
MyISAM
テーブルを圧縮できます。項7.11. 「mysqlcheck — テーブル メンテナンスと修復プログラム」、項4.9.4.1. 「myisamchk でクラッシュ リカバリ」、項7.6. 「myisampack — 圧縮された、読み取り専用MyISAM テーブルを作成する。」を参照して下さい。
MyISAM
テーブルには次のような特徴があります。
全てのデータ値は最初は下位バイトで格納されます。その為、データマシーンとOSは独立します。バイナリポータビリティに対する唯一の条件は、マシンが2個の補数符号付の整数とIEEE浮動小数点フォーマットを使用するという事だけです。これらの条件は主流マシンの間で広く利用されています。バイナリ互換性は、固有のプロセッサを持つ事がある内蔵システムには適合しない可能性があります。
データを最初に下位バイトで格納する事に関して、スピードに関する重大なペナルティはありません。テーブル行内のバイトは通常非同盟であり、非同盟バイトを順番に読み込むのは、逆の順番で読み込むよりも少し手間がかかります。また、カラム値をフェッチするサーバー内のコードは、他のコードに比べるとタイムクリティカルではありません。
全ての数値キー値は、よりよいインデックス圧縮の為に、上位バイトの物から先に格納されます。
大きいファイル (最高63-bitファイル) は、専用のファイルシステムとOSによってサポートされています。
MyISAM
テーブルには232
(~4.295E+09) 行の制限があります。MySQLを
--with-big-tables
オプションで作成すると、行の制限を
(232)2
(1.844E+19)
行に増加させる事ができます。詳しくは項2.9.2. 「典型的な configure オプション」を参照してください。MySQL
5.0.4バージョンより、全ての標準バイナリはこのオプションで作成されます。
1つのMyISAM
テーブルのインデックス数は最高64です。これは再コンパイルする事によって変更できます。MySQL
5.1.4から、1つのMyISAM
テーブルに許可されているインデックス数の最高値が
N
の場合、--with-max-indexes=
オプションを使ってconfigureを呼び出す事によって体型を設定できるようになりました。N
N
は128以下でなければいけません。MySQL
5.1.4以前のバージョンではソースを変える必要があります。
各インデックスのカラム最高数は16です。
最高キー長さは1000バイトです。これも、ソースを変えたり、再コンパイルする事によって変える事ができます。 キー長さが250バイト以上の場合は、デフォルトの1024バイトよりも大きいキーブロックサイズが使用されます。
ソートされた順番で行が挿入された時(AUTO_INCREMENT
カラムを使用している時と同様に)、高ノードが1つのキーだけを含むように、インデックスツリーが分割されます。
このおかげでインデックスツリーのスペース利用は向上します。
1つのテーブルに対する1つの
AUTO_INCREMENT
カラムの内部操作がサポートされます。MyISAM
はINSERT
と UPDATE
操作のカラムを自動的に更新します。そのおかげで
AUTO_INCREMENT
カラムは速くなります。
(最低10%)シーケンスの最上部の値が削除された後に再利用される事はありません。(AUTO_INCREMENT
が複数カラムインデックスの最後のカラムとして定義された場合は、シーケンスの最上部から削除された値が再利用される事があります。)AUTO_INCREMENT
値は ALTER TABLE
や
myisamchkでリセットできます。
動的サイズの行は、削除作業をアップデートと挿入でミックスした時には断片化される事が少なくなります。隣のブロックが削除された時に、隣接している削除されたブロックを自動的に一体化したり、ブロックを拡張したりする事でこれを行います。
もしテーブルのデータファイルの間に開いているブロックがなければ、他のスレッドが読み込みをしているのと同時に新しい行をINSERT
する事ができます。(これらは並列挿入として知られています。)行を削除する事や、それ自体の現在の内容よりも多くのデータを持つ動的長さの行をアップデートする事によって、フリーブロックが生じます。全てのフリーブロックが使用された(記入された)時、その後の挿入は再度並列になります。詳しくは項6.3.3. 「同時挿入」を参照してください。
スピードを上げるためにDATA
DIRECTORY
と INDEX DIRECTORY
テーブルオプションへのCREATE
TABLE
を使って、データファイルとインデックスファイルを別々のディレクトリに入れる事ができます。詳しくは項12.1.8. 「CREATE TABLE
構文」を参照してください。
BLOB
と TEXT
カラムはインデックスする事ができます。
NULL
値がインデックスカラムの中で許可されています。1つのキーに対して0–1
バイト使われます。
それぞれのキャラクタカラムは異なるキャラクタセットを持つ事ができます。詳しくは章 9. キャラクタセットサポートを参照してください。
MyISAM
インデックスファイルの中に、テーブルが正しく閉じられたかどうかを表すフラグがあります。もしmysqld
が --myisam-recover
オプションで開かれると MyISAM
テーブルは自動的にチェックされて、もし正しく閉じられてなかった時には修正されます。
myisamchk を--update-state
オプションで実行すると、チェックしたテーブルにマークをつけます。myisamchk
--fast
はこのマークがないテーブルだけをチェックします。
myisamchk --analyze はキー全体に対してするのと同様に、キーの一部分に統計データを格納します。
myisampack は BLOB
と
VARCHAR
カラムを圧縮する事ができます。
MyISAM
は次のような特徴をサポートします。
本物の VARCHAR
タイプへのサポート; VARCHAR
カラムは1バイトか2バイトで格納された長さから始まります。
VARCHAR
カラムを持つテーブルの行の長さは固定、または動的になり得ます。
1つのテーブル内の VARCHAR
と
CHAR
カラム長さの合計は、最高で
64KBになるでしょう。
任意長さ UNIQUE
制約。
追加情報
MyISAM
ストレージエンジンを専門に扱うフォーラムがあります。http://forums.mysql.com/list.php?21。