如何查看MySQL内部innodb临时表的大小

时间:2017-12-20 19:29:30

标签: mysql innodb amazon-rds-aurora

我看到大量internal temporary disk tables被写入。我可以通过SHOW GLOBAL STATUS where Variable_name like 'Created_tmp_disk_tables'看到计数。

我知道我可以更新max_heap_table_sizetmp_table_size来帮助防止这种情况,但是如果不知道写入磁盘的表的大小,很难知道要使用哪些值。

有谁知道如何找到这个值?

3 个答案:

答案 0 :(得分:1)

这不容易。在Percona Server中,可以选择在慢速查询日志中添加其他信息,以显示临时表的大小(请参阅https://www.percona.com/doc/percona-server/5.7/diagnostics/slow_extended.html

# User@Host: mailboxer[mailboxer] @  [192.168.10.165]
# Thread_id: 11167745  Schema: board
# Query_time: 1.009400  Lock_time: 0.000190  Rows_sent: 4  Rows_examined: 1543719  Rows_affected: 0  Rows_read: 4
# Bytes_sent: 278  Tmp_tables: 0  Tmp_disk_tables: 0  Tmp_table_sizes: 0
# QC_Hit: No  Full_scan: Yes  Full_join: No  Tmp_table: No  Tmp_table_on_disk: No
# Filesort: No  Filesort_on_disk: No  Merge_passes: 0

(上面的示例,取自Percona文档,显示了扩展字段,尽管该示例适用于未创建临时表的查询,因此大小显示为0.)

在Oracle MySQL中,PERFORMANCE_SCHEMA- 中的查询事件中提供了一些相同的扩展信息,但临时表大小却没有。

2014年,我记录了一个功能请求以提供此信息:https://bugs.mysql.com/bug.php?id=74484并且已经确认此错误,但据我所知,这尚未实现。

有点不清楚这是如何实现的,因为任何给定的查询都可以创建不同大小的多个临时表。我相信Percona功能显示了这种情况下临时表大小的总和。

我可以提供的建议是以增量增加max_heap_table_sizetmp_table_size,并监控Created_tmp_disk_tables报告的SHOW GLOBAL STATUS的增长率,进行比较到Created_tmp_tables(没有使用磁盘的临时表)。由于允许的tmp表大小能够容纳更大比例的临时表,因此您应该开始看到磁盘上临时表与内存临时表的比率会降低。

通常没有必要增加tmp_table_size来保存每个可能的临时表,无论多大。您希望最大的异常值来使用磁盘。但只要临时表在98%的时间内使用内存,你应该没问题。这意味着Created_tmp_disk_tables与Created_tmp_tables的比例应为1:50或更高。

答案 1 :(得分:1)

(比尔答案的附录。)

在5.7和8.0中处理tmp表时已经做了一些重大更改。我不确定它们中是否有任何适用于此处,但请注意。

超过tmp_table_size并不是使用基于磁盘的临时表的唯一原因 - TEXTBLOB@variablesUNION等。 (https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html中的更多细节)因此,我会质疑比尔的1:50建议。

Tmp表(磁盘上或内存中)可以通过大量查询创建;复杂查询可能需要多个tmp表。因此,同时tmp表的数量可能超过max_connections。因此,我建议保持tmp_table_size小于可用内存的1%。如果你确实有一个高设置需要大量的同时tmp表,你可能会导致交换,这对性能非常不利。

Created_tmp*tables的值很高,有许多“修复”;太多,无法在此逐项列出。如果您想提出查询(以及相关的SHOW CREATE TABLEs);我们可以讨论那个特例。

analyzing客户的系统出现时,我会查找

等内容
Created_tmp_disk_tables > 1/second
Created_tmp_disk_tables > 4% of queries
Created_tmp_tables > 20/second

在我看来,任何这些都表明需要仔细审查慢查询。但如果tmp_table_size大于RAM的1%,我建议降低它,即使它会伤害一些查询。

答案 2 :(得分:0)

只是查看文档,并假设只知道表的数量是不够的(查看Created_tmp_tables),变量tmpdir将为您提供存储这些表的目录的位置。降低tmp_table_size应确保在磁盘上创建临时表,以便您能够查看大小。