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