文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  優化 InnoDB 重做日誌

10.5.4 優化 InnoDB 重做日誌

請考慮下列優化重做日誌的指南

  • 增加重做日誌檔案的大小。當 InnoDB 寫入重做日誌檔案已滿時,它必須在檢查點中,將緩衝池的修改內容寫入磁碟。小的重做日誌檔案會導致許多不必要的磁碟寫入。

    重做日誌檔案的大小由 innodb_redo_log_capacity 決定。InnoDB 嘗試維護 32 個相同大小的重做日誌檔案,每個檔案的大小等於 1/32 * innodb_redo_log_capacity。因此,變更 innodb_redo_log_capacity 設定會變更重做日誌檔案的大小。

    如需修改重做日誌檔案組態的相關資訊,請參閱第 17.6.5 節,〈重做日誌〉

  • 考慮增加日誌緩衝區的大小。較大的日誌緩衝區可讓大型交易提交之前執行,而無需將日誌寫入磁碟。因此,如果您有更新、插入或刪除許多資料列的交易,則增大日誌緩衝區會節省磁碟 I/O。日誌緩衝區大小是使用 innodb_log_buffer_size 組態選項設定,該選項可以動態設定。

  • 設定 innodb_log_write_ahead_size 組態選項,以避免寫入時讀取。此選項定義重做日誌的預寫區塊大小。將 innodb_log_write_ahead_size 設定為符合作業系統或檔案系統快取區塊大小。當重做日誌的預寫區塊大小與作業系統或檔案系統快取區塊大小不符時,會發生寫入時讀取,因為重做日誌區塊未完全快取到作業系統或檔案系統。

    innodb_log_write_ahead_size 的有效值是 InnoDB 日誌檔案區塊大小 (2n) 的倍數。最小值是 InnoDB 日誌檔案區塊大小 (512)。指定最小值時,不會發生預寫。最大值等於 innodb_page_size 值。如果您為 innodb_log_write_ahead_size 指定的值大於 innodb_page_size 值,則 innodb_log_write_ahead_size 設定會截斷為 innodb_page_size 值。

    innodb_log_write_ahead_size 的值設定得太低,相對於作業系統或檔案系統快取區塊大小,會導致寫入時讀取 (read-on-write)。將該值設定得太高可能會對日誌檔寫入的 fsync 效能產生輕微影響,因為會一次寫入多個區塊。

  • MySQL 提供專用的日誌寫入器執行緒,用於將重做日誌記錄從日誌緩衝區寫入到系統緩衝區,並將系統緩衝區刷新到重做日誌檔案。您可以使用 innodb_log_writer_threads 變數啟用或停用日誌寫入器執行緒。專用的日誌寫入器執行緒可以提高高並行系統的效能,但對於低並行系統,停用專用的日誌寫入器執行緒可以提供更好的效能。

  • 最佳化使用者執行緒等待刷新的重做時所使用的旋轉延遲。旋轉延遲有助於減少延遲。在低並行期間,減少延遲可能不是優先事項,在此期間避免使用旋轉延遲可能會減少能源消耗。在高並行期間,您可能會希望避免將處理能力花在旋轉延遲上,以便將其用於其他工作。以下系統變數允許設定高和低水位值,這些值定義了使用旋轉延遲的邊界。

    • innodb_log_wait_for_flush_spin_hwm:定義使用者執行緒不再旋轉等待刷新重做的最大平均日誌刷新時間。預設值為 400 微秒。

    • innodb_log_spin_cpu_abs_lwm:定義使用者執行緒不再旋轉等待刷新重做的最低 CPU 使用量。該值表示為 CPU 核心使用量的總和。例如,預設值 80 表示單個 CPU 核心的 80%。在具有多核心處理器的系統上,值 150 表示一個 CPU 核心的 100% 使用率加上第二個 CPU 核心的 50% 使用率。

    • innodb_log_spin_cpu_pct_hwm:定義使用者執行緒不再旋轉等待刷新重做的最大 CPU 使用量。該值表示為所有 CPU 核心總處理能力組合的百分比。預設值為 50%。例如,兩個 CPU 核心的 100% 使用率是具有四個 CPU 核心的伺服器上組合 CPU 處理能力的 50%。

      innodb_log_spin_cpu_pct_hwm 組態選項會考量處理器親和性。例如,如果伺服器有 48 個核心,但 mysqld 處理程序僅限於四個 CPU 核心,則會忽略其他 44 個 CPU 核心。