MySQL EXPLAIN - 它每次都给我不同的解释

时间:2015-03-26 11:02:12

标签: mysql sql query-optimization explain

我有一个非常大的复杂查询,我正在尝试使用MySQL EXPLAIN SELECTEXPLAIN EXTENDED SELECT进行优化。

如果我针对查询运行它,我会看到查询中的每个表都在Using where列中使用Extra,这很棒。

根本不会更改任何数据,我会去喝杯茶或其他东西,回来重新运行EXPLAIN

这一次,仅仅几分钟后,只有20%的表格为Using where,主表格现在为Using index; Using temporary; Using filesort,而我的一天变成了一个试图调试此事的噩梦。

我知道有时像临时表和filesorts这样的东西比使用where子句和索引更有效。但不是这个数据库的大小为10GB的情况,并且创建临时表和filesorts会完全杀死服务器。

为什么会发生这种情况?这样的事情背后有逻辑或理由吗?!

1 个答案:

答案 0 :(得分:0)

你正在使用InnoDB,对吗?您使用的是5.6.6之前的版本,对吗?

你遇到了InnoDB缺乏“持久统计数据”的有趣变体。用于触发重新计算InnoDB表统计信息的几件事情。这些统计信息用于决定如何执行查询。

可能你的特定查询是“围栏” - 某些统计信息的细微变化会导致不同的查询计划。

如果您愿意,我们可以深入挖掘。但我们需要看到

  • SHOW CREATE TABLE
  • SHOW TABLE STATUS(表格大小的线索)
  • EXPLAIN EXTENDED SELECT...
  • EXPLAIN FORMAT=JSON SELECT...(5.6.5或更高版本)

我们可能会建议加快查询的方法。