MyISAMとInnoDBの違い

皆さん結構悩んでいるようなので、MyISAMInnoDBの相違点を表にしてみた。だけど、表にするほど単純な話ではないですね、本当は。

MyISAM InnoDB
ロック テーブルレベル 行/テーブルレベル
トランザクション なし ACIDトランザクションをサポート
キー圧縮 あり なし
全文検索インデックス あり なし
INSERT DELAYED 構文 あり なし
クラスタインデックス なし あり
物理ファイル テーブル毎にインデックスとデータファイルがある インスタンス単位で共通のデータファイルとログファイル*1
インデックスバッファ key_buffer innodb_buffer_pool_size
データバッファ OSのブロックバッファ innodb_buffer_pool_size
ログバッファ なし innodb_log_buffer_size

トランザクション指向なら選択の余地なくInnoDB、書き込み処理が支配的な場合もInnoDB、それ以外のときはMyISAM、というのが定番の選び方。あとは、主キーによるクラスタインデックスが使えるので、主キーでの検索が主体のときにInnoDBが良いケースがある。

*1:データファイルはテーブル毎にすることも可能