我有一个非常大的复杂查询,我正在尝试使用MySQL EXPLAIN SELECT
或EXPLAIN EXTENDED SELECT
进行优化。
如果我针对查询运行它,我会看到查询中的每个表都在Using where
列中使用Extra
,这很棒。
根本不会更改任何数据,我会去喝杯茶或其他东西,回来重新运行EXPLAIN
。
这一次,仅仅几分钟后,只有20%的表格为Using where
,主表格现在为Using index; Using temporary; Using filesort
,而我的一天变成了一个试图调试此事的噩梦。
我知道有时像临时表和filesorts这样的东西比使用where子句和索引更有效。但不是这个数据库的大小为10GB的情况,并且创建临时表和filesorts会完全杀死服务器。
为什么会发生这种情况?这样的事情背后有逻辑或理由吗?!
答案 0 :(得分:0)
你正在使用InnoDB,对吗?您使用的是5.6.6之前的版本,对吗?
你遇到了InnoDB缺乏“持久统计数据”的有趣变体。用于触发重新计算InnoDB表统计信息的几件事情。这些统计信息用于决定如何执行查询。
可能你的特定查询是“围栏” - 某些统计信息的细微变化会导致不同的查询计划。
如果您愿意,我们可以深入挖掘。但我们需要看到
SHOW CREATE TABLE
SHOW TABLE STATUS
(表格大小的线索)EXPLAIN EXTENDED SELECT...
EXPLAIN FORMAT=JSON SELECT...
(5.6.5或更高版本)我们可能会建议加快查询的方法。