我最近注意到我的MySQL服务器正在创建相当多的磁盘表[创建临时磁盘表:67,创建临时表:304].
我一直在努力确定哪些查询正在创建这些表,但我没有运气.我已经为查询耗时超过1秒启用了慢查询日志,但是那里显示的查询没有意义.在慢速查询日志中定期显示的唯一查询是使用主键作为where子句更新用户表上的单个行.
我对所有经常运行的查询都进行了'解释',而且我对罪魁祸首感到茫然.
如果您使用MySQL 5.6或更高版本,则可以使用性能模式。尝试类似的方法:
select * from events_statements_summary_by_digest where SUM_CREATED_TMP_DISK_TABLES>0\G
Run Code Online (Sandbox Code Playgroud)
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,则会使用其他信息和可配置性扩展慢查询日志,包括查询是否导致临时表或临时磁盘表.您甚至可以过滤慢查询日志以仅包含导致临时表或临时磁盘表的查询(我链接到的文档).
您还可以使用mk-query-digest处理Percona Server的慢查询日志,并对导致临时磁盘表的查询进行过滤.
mk-query-digest /path/to/slow.log --no-report --print \
--filter '($event->{Disk_tmp_table }||"") eq "Yes"'
Run Code Online (Sandbox Code Playgroud)
通常使用 an 的查询ORDER BY必须使用临时表。如果您运行EXPLAIN这些查询,您可能会看到:
using filesort ; using temporary tables
查找带有以下内容的查询ORDER BY
| 归档时间: |
|
| 查看次数: |
6152 次 |
| 最近记录: |