InnoDB
主執行緒和其他執行緒會在背景執行各種工作,其中大部分與 I/O 相關,例如從緩衝池中刷新髒頁,以及將變更從變更緩衝區寫入適當的次要索引。InnoDB
嘗試以不對伺服器的正常運作產生不利影響的方式執行這些工作。它會嘗試估計可用的 I/O 頻寬,並調整其活動以利用可用的容量。
innodb_io_capacity
變數定義 InnoDB
可用的整體 I/O 容量。它應設定為系統每秒可執行的 I/O 作業數 (IOPS)。設定 innodb_io_capacity
時,InnoDB
會根據設定的值估計可供背景工作使用的 I/O 頻寬。
您可以將 innodb_io_capacity
設定為 100 或更大的值。預設值為 10000
。通常,速度較快的硬碟、RAID 配置和固態硬碟 (SSD) 比低階儲存裝置 (例如最高 7200 RPM 的硬碟) 受益於更高的值。
理想情況下,請將設定保持在實際可行的最低值,但不要太低以致背景活動落後。如果值太高,則會將資料從緩衝池和變更緩衝區中移除太快,以致快取無法提供顯著的好處。對於能夠實現更高 I/O 速率的繁忙系統,您可以設定更高的值,以協助伺服器處理與高頻率列變更相關的背景維護工作。一般而言,您可以根據用於 InnoDB
I/O 的磁碟機數量來增加該值。例如,您可以在使用多個磁碟或 SSD 的系統上增加該值。
雖然您可以指定像一百萬這樣高的值,但在實務上,如此大的值幾乎沒有好處。一般而言,除非您確定較低的值不足以滿足您的工作負載,否則不建議使用高於 20000 的值。另請參閱 innodb_io_capacity_max
選項,該選項會在刷新落後時自動增加此值。
在調整 innodb_io_capacity
時,請考量寫入工作負載。具有大型寫入工作負載的系統可能會受益於更高的設定。對於寫入工作負載較小的系統,較低的設定可能就足夠了。
innodb_io_capacity
設定不是每個緩衝池執行個體的設定。可用的 I/O 容量在緩衝池執行個體之間平均分配,以進行刷新活動。
您可以在 MySQL 選項檔案 (my.cnf
或 my.ini
) 中設定 innodb_io_capacity
值,或使用 SET GLOBAL
陳述式在執行階段修改它,這需要具有足夠的權限才能設定全域系統變數。請參閱 第 7.1.9.1 節,〈系統變數權限〉。
預設啟用的 innodb_flush_sync
變數會導致在檢查點發生 I/O 活動突發時,忽略 innodb_io_capacity
設定。若要遵守 innodb_io_capacity
和 innodb_io_capacity_max
設定所定義的 I/O 速率,請停用 innodb_flush_sync
。
您可以在 MySQL 選項檔案(my.cnf
或 my.ini
)中設定 innodb_flush_sync
的值,或使用 SET GLOBAL
陳述式在執行階段修改它,這需要足夠的權限才能設定全域系統變數。請參閱第 7.1.9.1 節,〈系統變數權限〉。
如果刷新活動落後,InnoDB
可以更積極地刷新,其每秒 I/O 操作 (IOPS) 速率會高於 innodb_io_capacity
變數所定義的速率。innodb_io_capacity_max
變數定義了在這種情況下,InnoDB
背景工作執行的最大 IOPS 數量。
如果在啟動時指定 innodb_io_capacity
設定,但沒有指定 innodb_io_capacity_max
的值,則 innodb_io_capacity_max
預設為 innodb_io_capacity
值的兩倍。
在設定 innodb_io_capacity_max
時,innodb_io_capacity
的兩倍通常是一個好的起點。與 innodb_io_capacity
設定一樣,請盡可能將設定保持在較低的實用值,但不要低到使 InnoDB
無法充分將 IOPS 速率擴展到 innodb_io_capacity
設定之上。
在調整 innodb_io_capacity_max
時,請考慮寫入工作負載。具有較大寫入工作負載的系統可能會受益於較高的設定。對於寫入工作負載較小的系統,較低的設定可能就足夠了。
innodb_io_capacity_max
的值不能低於 innodb_io_capacity
的值。
使用 SET
陳述式(SET GLOBAL innodb_io_capacity_max=DEFAULT
)將 innodb_io_capacity_max
設定為 DEFAULT
會將 innodb_io_capacity_max
設定為預設值。
innodb_io_capacity_max
限制適用於所有緩衝池實例。它不是每個緩衝池實例的設定。