我最近注意到我的MySQL服务器正在创建相当多的磁盘表[创建了临时磁盘表:67,创建了临时表:304]。
我一直在努力确定哪些查询正在创建这些表,但我没有运气。我已经为查询耗时超过1秒启用了慢查询日志,但是那里显示的查询没有意义。在慢速查询日志中定期显示的唯一查询是对用户表上单行的更新,使用主键作为where子句。
我对所有经常运行的查询都进行了“解释”,而且我在罪魁祸首上空了。
答案 0 :(得分:5)
EXPLAIN报告可能会说“使用filesort”,但这会产生误导。它并不意味着它正在写入文件,它只意味着它在没有索引的情况下进行排序。
EXPLAIN报告可能会说“使用临时”,但这并不意味着它在磁盘上使用临时表。它可以在内存中创建一个小临时表。该表格必须符合max_heap_table_size和tmp_table_size的较小。如果增加tmp_table_size,还应增加max_heap_table_size以匹配。
有关临时表管理的更多信息,另请参阅http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html。
但这个价值的4演出非常高!请考虑可以使用每个连接来使用此内存。默认值为16兆,因此您将其增加了256倍。
因此,我们希望找到导致临时磁盘表的查询。
如果您运行MySQL 5.1或更高版本,则可以SET GLOBAL long_query_time=0将所有查询输出到慢速查询日志。请务必暂时执行此操作,并在完成后将其设置为非零值! : - )
如果您运行Percona Server,slow query log is extended包含其他信息和可配置性,包括查询是否导致临时表或临时磁盘表。您甚至可以过滤慢查询日志以仅包含导致临时表或临时磁盘表的查询(我链接到的文档)。
您还可以使用mk-query-digest处理Percona Server的慢查询日志,并过滤导致临时磁盘表的查询。
mk-query-digest /path/to/slow.log --no-report --print \
--filter '($event->{Disk_tmp_table }||"") eq "Yes"'
答案 1 :(得分:3)
如果您使用的是MySQL 5.6或更高版本,则可以使用性能架构。尝试类似:
select * from events_statements_summary_by_digest where SUM_CREATED_TMP_DISK_TABLES>0\G
答案 2 :(得分:2)
使用ORDER BY
的查询通常必须使用临时表。如果您对这些查询运行EXPLAIN
,则可能会看到:
using filesort ; using temporary tables
查找ORDER BY