請考慮下列優化重做日誌的準則
增加重做日誌檔的大小。當
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
值設定得太低會導致寫入時讀取。由於一次寫入數個區塊,將值設定得太高可能會對日誌檔案寫入的fsync
效能產生輕微影響。MySQL 提供專用的日誌寫入執行緒,將日誌緩衝區中的 redo 日誌記錄寫入系統緩衝區,並將系統緩衝區刷新到 redo 日誌檔案。您可以使用
innodb_log_writer_threads
變數啟用或停用日誌寫入執行緒。專用的日誌寫入執行緒可以提高高並發系統的效能,但對於低並發系統,停用專用的日誌寫入執行緒可以提供更好的效能。最佳化使用者執行緒等待刷新 redo 時的自旋延遲。自旋延遲有助於減少延遲。在低並發期間,減少延遲可能不是首要考量,在這些期間避免使用自旋延遲可能會減少能源消耗。在高並發期間,您可能希望避免在自旋延遲上消耗處理能力,以便將其用於其他工作。以下系統變數允許設定高和低水位值,這些值定義了自旋延遲使用的界限。
innodb_log_wait_for_flush_spin_hwm
:定義使用者執行緒等待刷新 redo 時不再自旋的最大平均日誌刷新時間。預設值為 400 微秒。innodb_log_spin_cpu_abs_lwm
:定義使用者執行緒等待刷新 redo 時不再自旋的最低 CPU 使用量。該值表示為 CPU 核心使用量的總和。例如,預設值 80 表示單個 CPU 核心的 80%。在具有多核心處理器的系統上,值 150 表示一個 CPU 核心的 100% 使用率加上第二個 CPU 核心的 50% 使用率。innodb_log_spin_cpu_pct_hwm
:定義使用者執行緒等待刷新 redo 時不再自旋的最高 CPU 使用量。該值表示為所有 CPU 核心總處理能力的百分比。預設值為 50%。例如,在具有四個 CPU 核心的伺服器上,兩個 CPU 核心的 100% 使用率是總 CPU 處理能力的 50%。innodb_log_spin_cpu_pct_hwm
組態選項會考量處理器親和性。例如,如果伺服器有 48 個核心,但 mysqld 程序僅限於四個 CPU 核心,則其他 44 個 CPU 核心將被忽略。