我看到大量internal temporary disk tables被写入。我可以通过SHOW GLOBAL STATUS where Variable_name like 'Created_tmp_disk_tables'
看到计数。
我知道我可以更新max_heap_table_size
和tmp_table_size
来帮助防止这种情况,但是如果不知道写入磁盘的表的大小,很难知道要使用哪些值。
有谁知道如何找到这个值?
答案 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_size
和tmp_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
并不是使用基于磁盘的临时表的唯一原因 - TEXT
,BLOB
,@variables
,UNION
等。 (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
应确保在磁盘上创建临时表,以便您能够查看大小。