InnoDB
は、可能であれば、I/O 操作を処理するための複数のスレッドを作成することによって非同期ディスク I/O を使用します。それにより、その I/O がまだ進行中の間もほかのデータベース操作を続行できるようにします。Linux および Windows プラットフォームでは、InnoDB は、使用可能な OS とライブラリ関数を使用して「ネイティブな」非同期 I/O を実行します。その他のプラットフォームの場合も、InnoDB は引き続き I/O スレッドを使用しますが、これらのスレッドが実際には I/O 要求の完了を待つ可能性があります。この手法は「シミュレートされた」非同期 I/O と呼ばれます。
先読み
InnoDB は、データがすぐに必要になる可能性が高いと判断できる場合は先読み操作を実行して、そのデータをメモリー内で使用できるようにバッファープールに移動します。連続したデータに対しては、いくつかの大きな読み取り要求を作成する方が、複数の拡散した小さな要求を作成するより効率的である場合があります。InnoDB には、次の 2 つの先読みに関する経験則があります。
シーケンシャル先読みでは、テーブルスペース内のセグメントへのアクセスパターンがシーケンシャルであることに気付くと、
InnoDB
はデータベースページの読み取りのバッチを I/O システムにあらかじめ送信します。ランダム先読みでは、テーブルスペース内の一部の領域がバッファープールに完全に読み取られている最中であることに気付くと、
InnoDB
は残りの読み取りを I/O システムに送信します。
二重書き込みバッファー
InnoDB
は、二重書き込みバッファーと呼ばれる構造に関連した斬新なファイルフラッシュ手法を使用しています。これはデフォルトで有効になっています (innodb_doublewrite=ON
)。これにより、クラッシュや停電のあとのリカバリの安全性が高まるだけでなく、fsync()
操作の必要性が減るため、ほとんどの種類の Unix でパフォーマンスが向上します。
データファイルにページを書き込む前に、InnoDB
はまず、それらのページを二重書き込みバッファーと呼ばれる連続したテーブルスペース領域に書き込みます。二重書き込みバッファーへの書き込みとフラッシュが完了したあとにはじめて、InnoDB
はそれらのページをデータファイル内の適切な位置に書き込みます。ページ書き込みの最中にオペレーティングシステム、ストレージサブシステム、または mysqld プロセスのクラッシュ (それによる破損ページの状態) が発生した場合、InnoDB
は、あとでリカバリ中にそのページの正常なコピーを二重書き込みバッファーから見つけることができます。