以下查询最终使用MariaDB 5.5.40中的“filesort”。完成大约需要9秒钟。 sos
和quotes
都是相当大的表,但没有什么可疯狂的。
explain
select SQL_NO_CACHE
`quotes`.`QuoteName`
FROM
`worknet`.`quotes`
LEFT JOIN `worknet`.`sostatus` AS `sostatusDB` ON `quotes`.`dnum`=`sostatusDB`.`so`
LEFT JOIN
(SELECT `dnum` from `worknet`.`sos`) AS `sosStatusDb`
ON `quotes`.`dnum`=`sosStatusDB`.`dnum`
where `quotes`.`deleted` IS NULL
ORDER BY `quotes`.`dateModified` DESC
LIMIT 100
1 PRIMARY <derived2> ALL 100 Using where; Using temporary; Using filesort
1 PRIMARY sos index PRIMARY SONUM 18 179433 Using where; Using index; Using join buffer (flat, BNL join)
2 DERIVED quotes index date_modified 5 100 Using where
但是,如果我在子查询中创建了一个人为限制,那么一切都会改变(为了更好!)。我用下面的限制线替换子查询行:
(SELECT `dnum` from `worknet`.`sos` LIMIT 18446744073709551615) AS `sosStatusDb`
1 PRIMARY <derived2> ALL 100 Using where; Using temporary; Using filesort
1 PRIMARY <derived3> ALL 179433 Using where; Using join buffer (flat, BNL join)
3 DERIVED sos index SONUM 18 179433 Using index
2 DERIVED quotes index date_modified 5 100 Using where
他们查询现在需要.078秒,而不是9.1秒。
很明显,限制是说服引擎使用更好的算法,但为什么呢?我施加的限制是巨大的(2 ^ 64-1),并且没有任何影响,但导致大大改善的时间。这似乎是优化器中的一个错误,但我找不到任何其他方法来改善性能。