InnoDB
盡可能使用非同步磁碟 I/O,方法是建立多個執行緒來處理 I/O 操作,同時允許其他資料庫操作在 I/O 仍在進行時繼續。在 Linux 和 Windows 平台上,InnoDB
使用可用的作業系統和程式庫函式來執行「原生」非同步 I/O。在其他平台上,InnoDB
仍然使用 I/O 執行緒,但執行緒實際上可能會等待 I/O 請求完成;此技術稱為「模擬」非同步 I/O。
如果 InnoDB
可以判斷出資料很可能很快會被需要,它會執行預讀操作,將該資料帶入緩衝池,以便在記憶體中可用。對連續資料發出少量的大型讀取請求,可能比發出多個分散的小型請求更有效率。InnoDB
中有兩種預讀啟發式演算法
在循序預讀中,如果
InnoDB
注意到表空間中某個區段的存取模式是循序的,它會預先將一批資料庫頁面的讀取發佈到 I/O 系統。在隨機預讀中,如果
InnoDB
注意到表空間中的某些區域似乎正在完全讀取到緩衝池中,它會將剩餘的讀取發佈到 I/O 系統。
有關設定預讀啟發式演算法的資訊,請參閱第 17.8.3.4 節「設定 InnoDB 緩衝池預取 (預讀)」。
InnoDB
使用一種新穎的檔案刷新技術,其中涉及一個稱為雙寫緩衝區的結構,在大多數情況下預設啟用 (innodb_doublewrite=ON
)。它增加了在意外退出或斷電後進行復原的安全性,並透過減少 fsync()
操作的需求,提高了大多數 Unix 變體上的效能。
在將頁面寫入資料檔案之前,InnoDB
會先將它們寫入稱為雙寫緩衝區的儲存區域。只有在寫入和刷新到雙寫緩衝區完成後,InnoDB
才會將頁面寫入資料檔案中的正確位置。如果在頁面寫入過程中,作業系統、儲存子系統或意外的 mysqld 程序退出 (導致損壞頁面狀況),InnoDB
後來可以在復原期間從雙寫緩衝區找到該頁面的良好副本。
有關雙寫緩衝區的更多資訊,請參閱第 17.6.4 節「雙寫緩衝區」。