数据库正在磁盘上创建临时表
您最近的磁盘上临时表使用量显著增加,高达 percentage
。数据库每秒创建大约 number
个临时表。这可能会影响性能并增加 db-instance
上的磁盘操作。
支持的引擎版本
Aurora MySQL 的所有版本都支持这些见解信息。
上下文
有时,MySQL 服务器在处理查询时需要创建内部临时表。Aurora MySQL 可以在内存中保留一个内部临时表,此临时表可在此由 TempTable 或 MEMORY 存储引擎进行处理,也可以由 InnoDB 存储在磁盘上。有关更多信息,请参阅《MySQL 参考手册》中的 MySQL 中的内部临时表使用
这个问题的可能原因
磁盘上临时表的增加表明使用了复杂的查询。如果配置的内存不足以在内存中存储临时表,则 Aurora MySQL 会在磁盘上创建表。这可能会影响性能并增加磁盘操作。
操作
根据见解的原因,我们建议采取不同的操作。
-
对于 Aurora MySQL 版本 3,我们建议您使用 TempTable 存储引擎。
-
通过仅选择必要的列来优化查询,以返回更少的数据。
如果在启用所有
statement
分析并对其定时的情况下开启性能模式,则可以查询SYS.statements_with_temp_tables
以检索使用临时表的查询列表。有关更多信息,请参阅 MySQL 文档中的使用 sys 模式的先决条件。 -
考虑对参与排序和分组操作的列编制索引。
-
重新编写您的查询以避免使用
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 存储引擎。 注意
使用 CREATE TABLE 显式创建 MEMORY 表时,只有
max_heap_table_size
变量决定表可以增长多大。也不会转换为磁盘上的格式。
相关指标
以下性能详情指标与此见解相关:
-
Created_tmp_disk_tables
-
Created_tmp_tables
有关更多信息,请参阅 MySQL 文档中的 Created_tmp_disk_tables