MyISAM
は古い (そしてすでに使用できない) ISAM
ストレージエンジンに基づいていますが、多くの役に立つ拡張機能を持っています。
表 16.2 「MyISAM ストレージエンジンの機能」
機能 | Support |
---|---|
B ツリーインデックス | はい |
MVCC | いいえ |
T ツリーインデックス | いいえ |
インデックスキャッシュ | はい |
クラスタデータベースのサポート | いいえ |
クラスタ化されたインデックス | いいえ |
ストレージの制限 | 256TB |
データキャッシュ | いいえ |
データディクショナリ向け更新統計 | はい |
トランザクション | いいえ |
ハッシュインデックス | いいえ |
バックアップ/ポイントインタイムリカバリ (ストレージエンジン内ではなくサーバー内で実装されています。) | はい |
レプリケーションのサポート (ストレージエンジン内ではなくサーバー内で実装されています。) | はい |
ロック粒度 | Table |
全文検索インデックス | はい |
圧縮データ | はい (圧縮された MyISAM テーブルがサポートされているのは、圧縮行フォーマットを使用している場合だけです。 MyISAM で圧縮行フォーマットを使用するテーブルは、読み取り専用です。) |
地理空間インデックスのサポート | はい |
地理空間データ型のサポート | はい |
外部キーのサポート | いいえ |
暗号化データ | はい (暗号化機能を介してサーバーに実装されます。) |
各 MyISAM
テーブルは、ディスク上の 2 つのファイルに格納されます。 そのファイル名はテーブル名で始まり、ファイルタイプを示す拡張子が付きます。 データファイルには .MYD
(MYData
) 拡張子が付きます。 インデックスファイルには .MYI
(MYIndex
) 拡張子が付きます。 テーブル定義は、MySQL データディクショナリに格納されます。
MyISAM
テーブルが必要であることを明示的に指定するには、ENGINE
テーブルオプションで指定します。
CREATE TABLE t (i INT) ENGINE = MYISAM;
MySQL 8.0 では通常、InnoDB
がデフォルトエンジンであるため、ENGINE
を使用して MyISAM
ストレージエンジンを指定する必要があります。
mysqlcheck クライアントか myisamchk ユーティリティーで MyISAM
テーブルをチェックしたり修正したりできます。 容量を節約するために myisampackを使って MyISAM
テーブルを圧縮することもできます。 セクション4.5.3「mysqlcheck — テーブル保守プログラム」、セクション4.6.4「myisamchk — MyISAM テーブルメンテナンスユーティリティー」、およびセクション4.6.6「myisampack — 圧縮された読み取り専用の MyISAM テーブルの生成」を参照してください。
MySQL 8.0 では、MyISAM
ストレージエンジンはパーティション分割をサポートしていません。 「以前のバージョンの MySQL で作成されたパーティション MyISAM
テーブルは、MySQL 8.0 では使用できません」。 詳細は、セクション24.6.2「ストレージエンジンに関連するパーティショニング制限」を参照してください。 このようなテーブルを MySQL 8.0 で使用できるようにアップグレードする方法の詳細は、セクション2.11.4「MySQL 8.0 での変更」 を参照してください。
MyISAM
テーブルには次のような特徴があります。
-
すべてのデータ値は、下位バイトから順に格納されます。 これにより、データマシンとオペレーティングシステムは依存しなくなります。 バイナリポータビリティーのための唯一の要件は、2 の補数の符号付き整数と IEEE 浮動小数点フォーマットを使用することです。 これらの要件は主流のマシンで幅広く使用されています。 バイナリポータビリティーは、組み込みシステムには適用されない可能性があります。特別のプロセッサを使用している場合があるためです。
下位バイトから順にデータを格納するため、大きな速度低下はありません。通常、テーブル行のバイトは整列しておらず、順番に未整列のバイトを読み込む処理は逆の順番に読み込む処理より時間がかかりません。 また、カラム値をフェッチするサーバーのコードは、ほかのコードに比べて速度は重視されません。
インデックスを効率良く圧縮ができるため、すべての数値キー値は上位バイトから順に格納されます。
大きなファイル (最大 63 ビットのファイル長) は、大きなファイルをサポートするファイルシステムとオペレーティングシステムでサポートされます。
MyISAM
テーブルの行数は、(232)2 (1.844E+19) の制限があります。-
1 つの
MyISAM
テーブルの最大インデックス数は 64 です。1 つのインデックスの最大カラム数は 16 です。
最大キー長は 1000 バイトです。 これは、ソースを変更して再コンパイルしても変えることができます。 キーが 250 バイトより長いと、キーのブロックサイズはデフォルト値の 1024 バイトより大きい値が使用されます。
ソートされた順番で行が挿入されたとき (
AUTO_INCREMENT
カラムを使用しているときと同様に)、上位のノードが 1 つのキーだけを含むように、インデックスツリーが分割されます。 これにより、インデックスツリーの領域の利用率が向上します。テーブルごとに 1 つの
AUTO_INCREMENT
カラムの内部処理がサポートされます。MyISAM
はINSERT
操作とUPDATE
操作でこのカラムを自動的に更新します。 これにより、AUTO_INCREMENT
カラムは速くなります (少なくとも 10 %)。 シーケンスの一番上の値は、削除されると、再利用されません。 (AUTO_INCREMENT
カラムがマルチカラムインデックスの最後のカラムとして定義された場合、シーケンスの最上部から削除された値が再利用されます。)AUTO_INCREMENT
値はALTER TABLE
や myisamchk でリセットできます。動的サイズの行は、削除を更新および挿入と併用すると、フラグメント化がかなり減少します。 これは、削除された隣接ブロックを自動的に結合し、次のブロックが削除されたときにブロックを拡張することで行われます。
MyISAM
は同時挿入をサポートしています。テーブルのデータファイルの途中に空きブロックがなければ、ほかのスレッドがテーブルから読み取るのと同時に新しい行をそれにINSERT
できます。 行を削除した結果として、または動的長の行を現在の内容より多くのデータで更新した結果として、空きブロックが発生する可能性があります。 すべての空きブロックが完全に使用されると (埋まると)、その後の挿入はふたたび並列になります。 セクション8.11.3「同時挿入」を参照してください。データファイルとインデックスファイルを異なる物理デバイス上の異なるディレクトリに置き、
DATA DIRECTORY
およびINDEX DIRECTORY
テーブルオプションをCREATE TABLE
に付けて速度を上げることができます。 セクション13.1.20「CREATE TABLE ステートメント」を参照してください。BLOB
とTEXT
カラムはインデックスを付けることができます。インデックスを付けたカラムでは
NULL
値が許可されます。 これには、キー当たり 0 - 1 バイトが必要です。文字カラムごとに異なる文字セットを持つことができます。 第10章「文字セット、照合順序、Unicode」を参照してください。
MyISAM
インデックスファイルの中に、テーブルが正しく閉じられたかどうかを表すフラグがあります。myisam_recover_options
システム変数を設定して mysqld を起動すると、MyISAM
テーブルはオープン時に自動的にチェックされ、テーブルが正しくクローズされなかった場合は修復されます。myisamchk は
--update-state
オプションを付けて実行したかどうかをテーブルにマークします。myisamchk --fast はこのマークがないテーブルだけを確認します。myisamchk --analyze はキー全体に対してするのと同様に、キーの一部分に対する統計データを格納します。
myisampack は
BLOB
とVARCHAR
カラムを圧縮できます。
MyISAM
は次のような機能もサポートしています。
真の
VARCHAR
型をサポートしています。VARCHAR
カラムは 1 バイトか 2 バイトで格納される長さから始まります。VARCHAR
カラムを持つテーブルの行の長さは固定でも動的でもかまいません。テーブル内の
VARCHAR
とCHAR
カラムの長さの合計は、最大で 64K バイトになる場合があります。任意の長さの
UNIQUE
制約。
追加のリソース
MyISAM
ストレージエンジンに特化したフォーラムは https://forums.mysql.com/list.php?21で参照できます。