当对子查询施加任意高限时,为什么MariaDB的行为会有所不同?

时间:2014-10-15 22:59:26

标签: sql mariadb

以下查询最终使用MariaDB 5.5.40中的“filesort”。完成大约需要9秒钟。 sosquotes都是相当大的表,但没有什么可疯狂的。

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),并且没有任何影响,但导致大大改善的时间。这似乎是优化器中的一个错误,但我找不到任何其他方法来改善性能。

0 个答案:

没有答案