InnoDBはMyISAMよりもはるかに優れていると誰かが私に言った。したがって、テーブルを作成するときは、常にMyISAMではなくInnoDBエンジンを使用する必要がありますか?それとも、両方に大きなメリットがありますか?
6 に答える
MyISAM
トランザクションレスでヒープ編成です。レコードはテーブル内の行オフセットによって識別され、インデックスはこのオフセットを行ポインターとして格納します。
InnoDB
トランザクションをサポートし、インデックス編成されています。レコードは の値によって識別されPRIMARY KEY
(または非表示の内部列がPRIMARY KEY
定義されていない)、 に格納されB-Tree
ます。セカンダリ インデックスは、の値をPRIMARY KEY
行ポインターとして格納します。
テーブル全体のスキャンまたはセカンダリ インデックス ルックアップを含むクエリは、通常、MyISAM
テーブルの方が高速です。
シークを含むクエリPRIMARY KEY
は、通常、InnoDB
テーブルの方が高速です。
MyISAM
テーブルは、テーブルのメタデータにテーブル内のレコード数を格納します。そのため、クエリは次のようになります。
SELECT COUNT(*)
FROM myisamtable
インスタントです。
MyISAM
テーブルは操作で完全にロックされDML
ます (いくつかの例外を除く)。
InnoDB
テーブルは個々のレコードとインデックス ギャップをロックしますが、これらはスキャンされるレコードとギャップであり、WHERE
条件に一致するものだけではありません。これにより、一致しないにもかかわらず、レコードがロックされる可能性があります。
InnoDB
テーブルは参照整合性をサポートしますFOREIGN KEY
。MyISAM
テーブルにはありません。
両方のエンジンの利点を示すシナリオがいくつかあります。
簡単な答え: いいえ、すべきではありません。
各エンジンに関するいくつかのポイント:
InnoDB
- 外部キーの制限とトランザクションを完全にサポートします。(ACID準拠)
- 行レベルのロック。
- おそらくより高速な INSERT ステートメント。(そしておそらくUPDATEも)
MyISAM
- より高速な SELECT ステートメント。
- 全文検索のサポート
- BLOB および TEXT 列に索引を付けることができます
- InnoDB と比較して最大ストレージ制限の 4 倍 (256TB 対 64TB)
詳しくはマニュアルをご覧ください:
簡単に言えば:
InnoDB を使用する必要があります。
- 取引サポートが必要な場合
- 外部キーが必要な場合
MyISAM を使用する必要があります。
- 上記の AND が必要ない場合
- 速度が必要です(データベース操作の高速化)
私見は、すべてのリレーショナルデータベースシステムの中心にあるトランザクションサポートのために、常に優先InnoDB
する必要があります.MyISAM
InnoDB は完全に ACID に準拠したデータベース エンジンであるため、トランザクションなどのサポートを提供します。そのため、別の方向に最適化される傾向がある MyISAM データベースよりも遅くなる可能性があります。
したがって、トランザクションが必要な場合は、InnoDB (または PostgreSQL などの別の RDBMS) が当然の選択です。
ウィキペディアに合理的な比較があります
両方を使用できます。書き込みデータベース/トランザクションに InnoDB を使用できますが、非正規化された MyISAM データベースから読み戻すことができます。これにより、両方の長所が得られます。データは InnoDB からの参照整合性により安全であることがわかっており、MyISAM を使用して好きなだけ高速に読み取ることができます。