MyISAMまたはInnoDBを決定する前に、それぞれがどのようにキャッシュするかに関して両方のストレージエンジンを確認する必要があります。
MyISAM
読み取られると、MyISAMテーブルのインデックスは.MYIファイルから1回読み取られ、MyISAMキーキャッシュにロードされます(key_buffer_sizeでサイズ設定されます)。MyISAMテーブルの.MYDをより速く読み取るにはどうすればよいですか?これとともに:
ALTER TABLE mytable ROW_FORMAT=Fixed;
これについては過去の投稿で書いた
InnoDB
OK、InnoDBはどうですか?InnoDBはクエリに対してディスクI / Oを行いますか?驚いたことに、そうです!あなたはおそらく私がそれを言っていることに夢中だと思っているでしょうが、それはSELECTクエリであっても絶対に本当です。この時点で、「InnoDBはクエリでディスクI / Oをどのように実行しているのでしょうか?」
すべては、ACID準拠のトランザクションストレージエンジンであるInnoDBに戻ります。InnoDBをトランザクション対応にするためにI
はACID
、分離であるin をサポートする必要があります。トランザクションの分離を維持する手法は、MVCC、Multiversion Concurrency Controlを介して行われます。簡単に言うと、InnoDBは、トランザクションがデータを変更しようとする前に、どのようなデータかを記録します。それはどこに記録されますか?システムテーブルスペースファイルでは、ibdata1としてよく知られています。これにはディスクI / Oが必要です。
比較
InnoDBとMyISAMの両方がディスクI / Oを行うので、どのランダムな要因が誰がより速いかを決定しますか?
- 列のサイズ
- 列のフォーマット
- 文字セット
- 数値の範囲(十分な大きさのINTが必要)
- ブロック間で分割されている行(行の連鎖)
DELETEs
およびによって引き起こされるデータの断片化UPDATEs
- 主キーのサイズ(InnoDBにはクラスター化インデックスがあり、2つのキールックアップが必要です)
- インデックスエントリのサイズ
- リストは続く...
エピローグ
したがって、読み取りの多い環境では、トランザクション動作をサポートするためにibdata1内に含まれるUNDOログに書き込まれる十分なデータがある場合、固定行形式のMyISAMテーブルがInnoDBバッファープールからのInnoDB読み取りよりも優れたパフォーマンスを発揮する可能性があります。 InnoDBデータに課せられます。データタイプ、クエリ、ストレージエンジンを慎重に計画します。データが増大すると、データの移動が非常に困難になる可能性があります。
ちなみに、私は5日前にこのようなものを書きました:mySQLにメモリ制限を割り当てるにはどうすればよいですか?