文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  設定 InnoDB 的執行緒並行

17.8.4 設定 InnoDB 的執行緒並行

InnoDB 使用作業系統執行緒來處理使用者交易的要求。(交易在提交或回滾之前可能會向 InnoDB 發出許多要求。)在具有多核心處理器的現代作業系統和伺服器上,其中內容切換效率很高,大多數工作負載在不限制並行執行緒數目的情況下都能良好執行。

在有助於最小化執行緒之間內容切換的情況下,InnoDB 可以使用多種技術來限制並行執行作業系統執行緒的數目(以及因此在任何時間處理的要求數目)。當 InnoDB 從使用者工作階段收到新要求時,如果並行執行的執行緒數目達到預定義的限制,則新要求會在短暫時間內休眠,然後再嘗試。等待鎖定的執行緒不會計入並行執行執行緒的數目中。

您可以設定組態參數 innodb_thread_concurrency 來限制並行執行緒的數目。一旦執行的執行緒數目達到此限制,其他執行緒會在休眠一段時間(由組態參數 innodb_thread_sleep_delay 設定的微秒數)後,才放入佇列。

您可以將組態選項 innodb_adaptive_max_sleep_delay 設定為您允許 innodb_thread_sleep_delay 的最高值,並且 InnoDB 會根據目前的執行緒排程活動自動調整 innodb_thread_sleep_delay 上下調整。這種動態調整有助於執行緒排程機制在系統負載較低以及接近滿載時順利運作。

在 MySQL 和 InnoDB 的不同版本中,innodb_thread_concurrency 的預設值和並行執行緒數目的隱含預設限制已變更。innodb_thread_concurrency 的預設值為 0,因此預設情況下,並行執行的執行緒數目沒有限制。

InnoDB 僅在並行執行緒數目受到限制時才會導致執行緒休眠。當執行緒數目沒有限制時,所有執行緒都平等地競爭被排程。也就是說,如果 innodb_thread_concurrency0,則會忽略 innodb_thread_sleep_delay 的值。

當執行緒數目有限制時(當 innodb_thread_concurrency > 0 時),InnoDB 藉由允許在執行單一 SQL 陳述式期間發出的多個要求進入 InnoDB 而不需遵守 innodb_thread_concurrency 所設定的限制,來減少內容切換的額外負擔。由於 SQL 陳述式(例如聯結)可能在 InnoDB 內包含多個資料列操作,因此 InnoDB 會指派指定數量的票證,允許執行緒以最小的額外負擔重複排程。

當新的 SQL 語句開始時,執行緒沒有任何票證,且必須觀察 innodb_thread_concurrency。一旦執行緒獲准進入 InnoDB,它會被分配一定數量的票證,可用於後續進入 InnoDB 執行資料列操作。如果票證用完,執行緒會被逐出,並再次觀察 innodb_thread_concurrency,這可能會將執行緒放回等待執行緒的先進先出佇列中。當執行緒再次獲准進入 InnoDB 時,會再次分配票證。分配的票證數量由全域選項 innodb_concurrency_tickets 指定,預設值為 5000。等待鎖定的執行緒會在鎖定可用時獲得一張票證。

這些變數的正確值取決於您的環境和工作負載。請嘗試不同的值範圍,以確定適合您應用程式的值。在限制並行執行的執行緒數量之前,請查看可能提高多核心和多處理器電腦上 InnoDB 效能的組態選項,例如 innodb_adaptive_hash_index

關於 MySQL 執行緒處理的一般效能資訊,請參閱第 7.1.12.1 節,「連線介面」