

# 数据库正在磁盘上创建临时表
<a name="proactive-insights.temp-tables"></a>

您最近的磁盘上临时表使用量显著增加，高达 {{percentage}}。数据库每秒创建大约 {{number}} 个临时表。这可能会影响性能并增加 {{db-instance}} 上的磁盘操作。

**Topics**
+ [支持的引擎版本](#proactive-insights.temp-tables.context.supported)
+ [上下文](#proactive-insights.temp-tables.context)
+ [这个问题的可能原因](#proactive-insights.temp-tables.causes)
+ [操作](#proactive-insights.temp-tables.actions)
+ [相关指标](#proactive-insights.temp-tables.metrics)

## 支持的引擎版本
<a name="proactive-insights.temp-tables.context.supported"></a>

Aurora MySQL 的所有版本都支持这些见解信息。

## 上下文
<a name="proactive-insights.temp-tables.context"></a>

有时，MySQL 服务器在处理查询时需要创建内部临时表。Aurora MySQL 可以在内存中保留一个内部临时表，此临时表可在此由 TempTable 或 MEMORY 存储引擎进行处理，也可以由 InnoDB 存储在磁盘上。有关更多信息，请参阅《MySQL 参考手册》**中的 [MySQL 中的内部临时表使用](https://dev.mysql.com/doc/refman/5.6/en/internal-temporary-tables.html)。

## 这个问题的可能原因
<a name="proactive-insights.temp-tables.causes"></a>

磁盘上临时表的增加表明使用了复杂的查询。如果配置的内存不足以在内存中存储临时表，则 Aurora MySQL 会在磁盘上创建表。这可能会影响性能并增加磁盘操作。

## 操作
<a name="proactive-insights.temp-tables.actions"></a>

根据见解的原因，我们建议采取不同的操作。
+ 对于 Aurora MySQL 版本 3，我们建议您使用 TempTable 存储引擎。
+ 通过仅选择必要的列来优化查询，以返回更少的数据。

  如果在启用所有 `statement` 分析并对其定时的情况下开启性能模式，则可以查询 `SYS.statements_with_temp_tables` 以检索使用临时表的查询列表。有关更多信息，请参阅 MySQL 文档中的[使用 sys 模式的先决条件](https://dev.mysql.com/doc/refman/8.0/en/sys-schema-prerequisites.html)。
+ 考虑对参与排序和分组操作的列编制索引。
+ 重新编写您的查询以避免使用 `BLOB` 和 `TEXT` 列。这些列始终使用磁盘。
+ 调整以下数据库参数：`tmp_table_size` 和 `max_heap_table_size`。

  这些参数的原定设置值为 16MiB。对内存中的临时表使用 MEMORY 存储引擎时，其最大大小由 `tmp_table_size` 或 `max_heap_table_size` 值定义，以较小者为准。当达到此最大大小时，MySQL 会自动将内存中的内部临时表转换为 InnoDB 磁盘上的内部临时表。有关更多信息，请参阅[在 Amazon RDS for MySQL 和 Amazon Aurora MySQL 上使用 TempTable 存储引擎](https://www.amazonaws.cn/blogs/database/use-the-temptable-storage-engine-on-amazon-rds-for-mysql-and-amazon-aurora-mysql/)。
**注意**  
使用 CREATE TABLE 显式创建 MEMORY 表时，只有 `max_heap_table_size` 变量决定表可以增长多大。也不会转换为磁盘上的格式。

## 相关指标
<a name="proactive-insights.temp-tables.metrics"></a>

以下性能详情指标与此见解相关：
+ Created\_tmp\_disk\_tables
+ Created\_tmp\_tables

有关更多信息，请参阅 MySQL 文档中的 [Created\_tmp\_disk\_tables](https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html#statvar_Created_tmp_disk_tables)。