

# synch/mutex/innodb/temp\$1pool\$1manager\$1mutex
<a name="ams-waits.io-temppoolmanager"></a>

当会话等待获取用于管理会话临时表空间池的互斥锁时，会发生 `synch/mutex/innodb/temp_pool_manager_mutex` 等待事件。

**Topics**
+ [

## 支持的引擎版本
](#ams-waits.io-temppoolmanager.context.supported)
+ [

## 上下文
](#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

## 上下文
<a name="ams-waits.io-temppoolmanager.context"></a>

Aurora MySQL 3.x 版及更高版本使用 `temp_pool_manager_mutex` 控制同时访问临时表空间池的多个会话。Aurora MySQL 通过 Aurora 集群卷管理永久性数据的存储和临时文件的本地存储。当会话在 Aurora 集群卷上创建临时表时，需要临时表空间。

当会话首次请求临时表空间时，MySQL 会从共享池中分配会话临时表空间。对于以下表类型，一个会话一次最多可以容纳 2 个临时表空间：
+ 用户创建的临时表
+ 优化程序生成的内部临时表

默认 `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\$1SCHEMA 审核查询
](#ams-waits.io-temppoolmanager.actions.schema-queries)
+ [

### 增大 innodb\$1sync\$1array\$1size 参数
](#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` 存储引擎的更多信息，请参阅 [Use the TempTable storage engine on Amazon RDS for MySQL and Amazon Aurora MySQL](https://aws.amazon.com/blogs/database/use-the-temptable-storage-engine-on-amazon-rds-for-mysql-and-amazon-aurora-mysql/)。

### 使用 INFORMATION\$1SCHEMA 审核查询
<a name="ams-waits.io-temppoolmanager.actions.schema-queries"></a>

当您查询 `INFORMATION_SCHEMA` 表时，MySQL 会在集群卷上创建 InnoDB 临时表。每个会话都需要一个用于存放这些表的临时表空间，这可能会在高并发访问期间导致性能问题。

为提高性能，请执行以下操作：
+ 尽可能使用 `INFORMATION_SCHEMA` 代替 `PERFORMANCE_SCHEMA`。
+ 如果必须使用 `INFORMATION_SCHEMA`，请降低运行这些查询的频率。

### 增大 innodb\$1sync\$1array\$1size 参数
<a name="ams-waits.io-temppoolmanager.actions.sync_array"></a>

`innodb_sync_array_size` 参数控制 MySQL 中互斥锁/锁定等待数组的大小。`1` 的默认值适用于一般工作负载，但增大默认值可以减少高并发期间的线程争用。

当您的工作负载显示等待线程数量不断增加时：
+ 监控工作负载中等待线程的数量。
+ 将 `innodb_sync_array_size` 设置为等于或大于实例的 vCPU 计数，以拆分线程协调结构并减少争用。

**注意**  
要确定您的 RDS 实例上可用的 vCPU 数量，请参阅 [Amazon RDS 实例类型](https://aws.amazon.com/rds/instance-types/)中的 vCPU 规格。

### 实施连接池
<a name="ams-waits.io-temppoolmanager.actions.connection_pooling"></a>

MySQL 会为每个创建临时表的会话分配一个专用的表空间。在数据库连接终止之前，此表空间一直处于活动状态。为了更有效地管理您的资源，请执行以下操作：
+ 实现连接池以限制活动临时表空间的数量。
+ 重复使用现有连接，而不是为每个操作创建新连接。