MyISAMストレージエンジンとは
MyISAMは、
MySQLリレーショナルデータベース管理システムで、かつて標準のストレージエンジンとして採用されていました。古いISAMコードを基盤とし、多くの便利な拡張が施されています。
MySQL 5.5より前のバージョンではデフォルトのエンジンでしたが、5.5以降は
InnoDBが標準となっています。
ファイルシステム
MyISAMでは、各テーブルは通常、3つのファイルとしてディスクに保存されます。これらのファイルは、テーブル名に拡張子を加えた形式で構成されます。
`.frm`ファイル: テーブルの定義情報を格納。MySQLデータベースの仕様の一部であり、MyISAMの仕様には含まれません。
`.MYD`ファイル: データファイル。実際のデータが格納されます。
`.MYI`ファイル: インデックスファイル。データの検索を高速化するためのインデックス情報が格納されます。インデックスファイルが破損した場合でも、再作成が可能です。
ファイルの形式は、`ROW_FORMAT`テーブルオプションによって異なります。以下の3つの形式が利用可能です。
`FIXED`: すべてのデータを固定長で格納します。読み取りが高速で、テーブルの修復も容易です。ただし、大きな可変長列(BLOBやTEXT型)が含まれるテーブルでは使用できません。
`DYNAMIC`: 可変長列のサイズは固定されません。ディスクスペースを節約できますが、読み取り速度は少し遅くなります。
`COMPRESSED`: 専用ツールを使用して作成する読み取り専用テーブルです。圧縮率が高くディスクスペースを大幅に節約できますが、作成に手間がかかります。
MyISAMファイルはシステムに依存せず、
トランザクションをサポートしないため、異なるサーバー間でファイルをコピーして利用できます。
特徴
MyISAMは、読み取り操作が多く、書き込みが少ない環境に最適化されています。データウェアハウスのように、非常に大きなテーブルに対してクエリを発行し、テーブルの更新が夜間などデータベースが使用されていない時間帯に行われる場合に適しています。
MyISAMが高速な読み取りを実現できるのは、そのインデックス構造によるものです。各インデックスエントリは、データファイル内のレコードを指すポインタを持っており、このポインタはファイル先頭からのオフセット値で表されます。特に`FIXED`形式の場合、レコードの長さが固定されているため、高速な読み取りが可能です。また、挿入操作も簡単で、データファイルの最後に新しい行を追加するだけです。
一方、削除や更新操作には課題があります。削除の場合、行のオフセット値を変更しないために、削除されたスペースはそのまま残されます。更新の場合、行の長さが短くなれば空きスペースが残り、長くなれば行が断片化されます。空きスペースをなくし、断片化された行を整理するには、`OPTIMIZE TABLE`コマンドを実行する必要があります。MyISAMは仕組みが単純なため、インデックス統計が非常に正確です。
しかし、MyISAMの単純さには欠点も存在します。最も大きな課題は
トランザクションをサポートしないことです。外部キーもサポートしていません。また、通常のユースケースでは、
InnoDBの方がMyISAMよりも高速に動作する場合があります。
MySQL 5.5以降のバージョンでは、参照整合性の制約とより高い同時実行性を確保するため、
InnoDBエンジンが標準となりました。
MyISAMは、FULLTEXTインデックス作成とOpenGISデータ型をサポートしています。
MariaDBは、Ariaと呼ばれるクラッシュに強いMyISAMの代替ストレージエンジンを使用しています。しかし、
MariaDBの開発者もMyISAMの機能開発を継続しており、キーキャッシュのセグメント化機能を実装しました。この機能により、MyISAMインデックスのキャッシュがセグメントに分割され、スレッドがキャッシュ全体をロックする必要がなくなり、同時実行性が向上します。
MariaDBでは、MyISAMは仮想列もサポートしています。
DrizzleはMyISAMをサポートしていません。
まとめ
MyISAMは、
MySQLにおいて歴史的に重要なストレージエンジンでしたが、
トランザクションサポートの欠如など、いくつかの制約があります。現在では、
InnoDBがより多くの状況で優れた選択肢となっています。しかし、MyISAMが持つ高速な読み取り性能は、特定の状況下では依然として有効です。
関連項目
MySQLデータベースエンジンの比較 (仮のURL)
外部リンク
MySQL Documentation on MyISAM Storage Engine
MyISAM's open files limit and table-cache problem explained (仮のURL)
Using MyISAM in production (仮のURL)
MySQL Engines - MyISAM vs Innodb by Rackspace (2015年2月8日にアーカイブ)
Convert your MySQL database from MyISAM to
InnoDB, and get ready for Drupal 7 at the same time (2013年3月8日にアーカイブ)
*
Converting Tables from MyISAM to InnoDB (仮のURL)