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