MySQL 8.0 リファレンスマニュアル


16.2 MyISAM ストレージエンジン

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 カラムの内部処理がサポートされます。 MyISAMINSERT 操作と UPDATE 操作でこのカラムを自動的に更新します。 これにより、AUTO_INCREMENT カラムは速くなります (少なくとも 10 %)。 シーケンスの一番上の値は、削除されると、再利用されません。 (AUTO_INCREMENT カラムがマルチカラムインデックスの最後のカラムとして定義された場合、シーケンスの最上部から削除された値が再利用されます。) AUTO_INCREMENT 値は ALTER TABLEmyisamchk でリセットできます。

  • 動的サイズの行は、削除を更新および挿入と併用すると、フラグメント化がかなり減少します。 これは、削除された隣接ブロックを自動的に結合し、次のブロックが削除されたときにブロックを拡張することで行われます。

  • MyISAM は同時挿入をサポートしています。テーブルのデータファイルの途中に空きブロックがなければ、ほかのスレッドがテーブルから読み取るのと同時に新しい行をそれに INSERT できます。 行を削除した結果として、または動的長の行を現在の内容より多くのデータで更新した結果として、空きブロックが発生する可能性があります。 すべての空きブロックが完全に使用されると (埋まると)、その後の挿入はふたたび並列になります。 セクション8.11.3「同時挿入」を参照してください。

  • データファイルとインデックスファイルを異なる物理デバイス上の異なるディレクトリに置き、DATA DIRECTORY および INDEX DIRECTORY テーブルオプションを CREATE TABLE に付けて速度を上げることができます。 セクション13.1.20「CREATE TABLE ステートメント」を参照してください。

  • BLOBTEXT カラムはインデックスを付けることができます。

  • インデックスを付けたカラムでは NULL 値が許可されます。 これには、キー当たり 0 - 1 バイトが必要です。

  • 文字カラムごとに異なる文字セットを持つことができます。 第10章「文字セット、照合順序、Unicodeを参照してください。

  • MyISAM インデックスファイルの中に、テーブルが正しく閉じられたかどうかを表すフラグがあります。 myisam_recover_options システム変数を設定して mysqld を起動すると、MyISAM テーブルはオープン時に自動的にチェックされ、テーブルが正しくクローズされなかった場合は修復されます。

  • myisamchk--update-state オプションを付けて実行したかどうかをテーブルにマークします。myisamchk --fast はこのマークがないテーブルだけを確認します。

  • myisamchk --analyze はキー全体に対してするのと同様に、キーの一部分に対する統計データを格納します。

  • myisampackBLOBVARCHAR カラムを圧縮できます。

MyISAM は次のような機能もサポートしています。

  • 真の VARCHAR 型をサポートしています。VARCHAR カラムは 1 バイトか 2 バイトで格納される長さから始まります。

  • VARCHAR カラムを持つテーブルの行の長さは固定でも動的でもかまいません。

  • テーブル内の VARCHARCHAR カラムの長さの合計は、最大で 64K バイトになる場合があります。

  • 任意の長さの UNIQUE 制約。

追加のリソース


関連キーワード:  テーブル, ストレージ, エンジン, インデックス, カラム, サポート, バイト, キー, 圧縮, FEDERATED