web-dev-qa-db-ja.com

どのMySQLストレージエンジンを選択しますか?

どのmysqlエンジンを選択すればよいか混乱しています(最もよく使用されるMyISAMとInnoDBについて話しましょう)。

理論は言う:

  • どちらもBTreeインデックスで機能しますが、MyISAMはFULLTEXTインデックスでも機能します。
  • MyISAMが緩い場合、InnoDBはデータの整合性においてより厳密です。
  • InnoDBにはトランザクションがありますが、MyISAMにはありません。
  • InnoDBには外部キーと関係制約がありますが、MyISAMにはありません。
  • MyISAMは読み取りは高速ですが、書き込みは低速です(これについてはわかりません)。

テーブルを作成するとき、整合性を維持したい場合や、「テキスト」で検索するクエリを高速化したい場合は、常に何かを犠牲にする必要がありますか?

必要な場合に使用するエンジンをどのように決定しますか

  • 整合性?
  • 速度 ?
  • 制約?
  • テキストで検索しますか?
  • 取引?
6
jcho360

どちらもbツリーインデックスで機能しますが、MyISAMはFULLTEXTインデックスでも機能します。

MySQL 5.6は、FULLTEXTインデックスもサポートすることになっています。 GA になったときにそれを探します。

InnoDBはデータの整合性がより厳格ですが、MyISAMは緩いです

InnoDBにはトランザクションがありますが、MyISAMにはありません。

InnoDBには外部キーと関係制約がありますが、MyISAMにはありません。

これは、InnoDBが [〜#〜] mvcc [〜#〜]を介してトランザクション分離をサポートするという事実に照らして当てはまります 。つまり、InnoDBを完全に [〜#〜] acid [〜#〜] に準拠させる。

MyISAMは読み取りが高速ですが、書き込みが低速です(これについてはわかりません)

これは、MyISAMテーブルの行形式(固定または動的)に完全に依存します。遅いのは相対的です。結局のところ、MyISAMに対する各DMLステートメントは、毎回フルテーブルロックを実行します。

十分な大きさのキャッシュがある場合、COMMITが遅延する可能性があるため、InnoDBは読み取りと書き込みの両方でより高速になります。これにより、InnoDBバッファープールに既にキャッシュされているデータは、メモリから直接読み取ることができます。

InnoDBはデータとインデックスの両方をキャッシュしますが、MyISAMはインデックスのみをキャッシュします 。したがって、MyISAMからのデータのディスク読み取りは常に必要です。

6
RolandoMySQLDBA