

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# synch/mutex/innodb/temp\_pool\_manager\_mutex
<a name="ams-waits.io-temppoolmanager"></a>

當工作階段正在等待取得互斥以管理工作階段暫存資料表空間集區時，會發生`synch/mutex/innodb/temp_pool_manager_mutex`等待事件。

**Topics**
+ [支援的引擎版本](#ams-waits.io-temppoolmanager.context.supported)
+ [Context](#ams-waits.io-temppoolmanager.context)
+ [等待時間增加的可能原因](#ams-waits.io-temppoolmanager.causes)
+ [動作](#ams-waits.io-temppoolmanager.actions)

## 支援的引擎版本
<a name="ams-waits.io-temppoolmanager.context.supported"></a>

下列引擎版本支援這個等待事件資訊：
+ Aurora MySQL 第 3 版

## Context
<a name="ams-waits.io-temppoolmanager.context"></a>

Aurora MySQL 3.x 版和更新版本使用 `temp_pool_manager_mutex` 來控制同時存取暫存資料表空間集區的多個工作階段。Aurora MySQL 透過 Aurora 叢集磁碟區管理持久性資料儲存，以及管理暫存檔案的本機儲存。當工作階段在 Aurora 叢集磁碟區上建立暫存資料表時，需要暫存資料表空間。

當工作階段第一次請求暫存資料表空間時，MySQL 會從共用集區配置工作階段暫存資料表空間。對於下列資料表類型，工作階段一次最多可保留 2 個暫存資料表空間：
+ 使用者建立的暫存資料表
+ Optimizer 產生的內部暫時資料表

預設`TempTable`引擎使用下列溢位機制來處理暫存資料表：
+ 將資料表存放在 RAM 中，上限為 [https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram) 。
+ 當 RAM 已滿時，移至本機儲存體上的記憶體映射檔案。
+ 當記憶體映射檔案達到其[https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap)限制時，使用共用叢集磁碟區。

暫存資料表超過 RAM 和本機儲存限制後，MySQL 會使用磁碟上資料表空間來管理它們。

當工作階段需要磁碟上暫存資料表時，MySQL：
+ 尋找集區中要重複使用的可用`INACTIVE`資料表空間。
+ 如果沒有`INACTIVE`空格，則建立新的 10 個資料表空間。

當工作階段中斷連線時，MySQL：
+ 截斷工作階段的暫存資料表空間。
+ 在集區中將其標記為非作用中以重複使用。
+ 維護目前的集區大小，直到伺服器重新啟動為止。
+ 重新啟動後，返回預設集區大小 (10 個資料表空間）。

## 等待時間增加的可能原因
<a name="ams-waits.io-temppoolmanager.causes"></a>

導致此等待事件的常見情況：
+ 在叢集磁碟區上建立內部暫存資料表的並行工作階段。
+ 在叢集磁碟區上建立使用者暫存資料表的並行工作階段。
+ 使用作用中資料表空間突然終止工作階段。
+ 大量寫入工作負載期間的資料表空間集區擴展。
+ 同時查詢存取 `INFORMATION_SCHEMA.`

## 動作
<a name="ams-waits.io-temppoolmanager.actions"></a>

根據等待事件的原因，我們會建議不同的動作。

**Topics**
+ [監控和最佳化暫存資料表用量](#ams-waits.io-temppoolmanager.actions.monitor)
+ [使用 INFORMATION\_SCHEMA 檢閱查詢](#ams-waits.io-temppoolmanager.actions.schema-queries)
+ [增加 innodb\_sync\_array\_size 參數](#ams-waits.io-temppoolmanager.actions.sync_array)
+ [實作連線集區](#ams-waits.io-temppoolmanager.actions.connection_pooling)

### 監控和最佳化暫存資料表用量
<a name="ams-waits.io-temppoolmanager.actions.monitor"></a>

若要監控和最佳化暫存資料表用量，請使用下列其中一種方法：
+ 檢查績效詳情中的`Created_tmp_disk_tables`計數器，以追蹤整個 Aurora 叢集的磁碟上暫存資料表建立。
+ 在資料庫中執行此命令，以直接監控暫存資料表的建立：`mysql> show status like '%created_tmp_disk%'`。

**注意**  
Aurora MySQL 讀取器節點和寫入器節點之間的暫時資料表行為不同。如需詳細資訊，請參閱[Aurora MySQL 第 3 版的新暫時資料表行為](ams3-temptable-behavior.md)。

識別建立暫存資料表的查詢之後，請採取下列最佳化步驟：
+ 使用 `EXPLAIN` 來檢查查詢執行計畫，並識別建立暫存資料表的位置和原因。
+ 盡可能修改查詢以減少暫時資料表用量。

如果僅查詢最佳化無法解決效能問題，請考慮調整這些組態參數：
+  [https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram)- 控制暫存資料表的 RAM 用量上限。
+  [https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap) - 設定記憶體映射檔案儲存的限制。
+ [https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html#sysvar_tmp_table_size](https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html#sysvar_tmp_table_size)- 啟用 `aurora_tmptable_enable_per_table_limit` 時套用 （預設為停用）。

**重要**  
請注意，無論組態設定為何，某些查詢條件一律需要磁碟上暫存資料表。如需`TempTable`詳細資訊，請參閱[在 Amazon RDS for MySQL 和 Amazon Aurora MySQL 上使用 TempTable 儲存引擎](https://aws.amazon.com/blogs/database/use-the-temptable-storage-engine-on-amazon-rds-for-mysql-and-amazon-aurora-mysql/)。

### 使用 INFORMATION\_SCHEMA 檢閱查詢
<a name="ams-waits.io-temppoolmanager.actions.schema-queries"></a>

當您查詢`INFORMATION_SCHEMA`資料表時，MySQL 會在叢集磁碟區上建立 InnoDB 暫存資料表。每個工作階段都需要這些資料表的暫時資料表空間，這可能會在高並行存取期間導致效能問題。

若要改善效能：
+ `INFORMATION_SCHEMA` 盡可能使用 `PERFORMANCE_SCHEMA`而非 。
+ 如果您必須使用 `INFORMATION_SCHEMA`，請減少執行這些查詢的頻率。

### 增加 innodb\_sync\_array\_size 參數
<a name="ams-waits.io-temppoolmanager.actions.sync_array"></a>

`innodb_sync_array_size` 參數控制 MySQL 中互斥/鎖定等待陣列的大小。的預設值`1`適用於一般工作負載，但增加預設值可以減少高並行期間的執行緒爭用。

當您的工作負載顯示等待執行緒數量增加時：
+ 監控工作負載中等待執行緒的數量。
+ 設定為`innodb_sync_array_size`等於或高於執行個體的 vCPU 計數，以分割執行緒協調結構並減少爭用。

**注意**  
若要判斷 RDS 執行個體上可用的 vCPUs 數量，請參閱 [Amazon RDS 執行個體類型 ](https://aws.amazon.com/rds/instance-types/)中的 vCPU 規格。

### 實作連線集區
<a name="ams-waits.io-temppoolmanager.actions.connection_pooling"></a>

MySQL 會將專用資料表空間指派給建立暫存資料表的每個工作階段。此資料表空間會保持作用中狀態，直到資料庫連線結束為止。若要更有效率地管理您的 資源：
+ 實作連線集區以限制作用中暫存資料表空間的數量。
+ 重複使用現有的連線，而不是為每個操作建立新的連線。