为什么MySQL更喜欢单一索引而不是复合索引?



我现在有这个查询:

SELECT 
*
FROM
(`session`)
WHERE
(`session`.`isSale` = 0)
AND (`session`.`createDatetime` >= (NOW() - INTERVAL 3 WEEK))
AND (`session`.`sellerName` IS NOT NULL)
GROUP BY `session`.`id`
ORDER BY `session`.`id` DESC;

和我有以下索引:

idx_createDatetime (`createDatetime` ASC)
idx_isSale (`isSale` ASC)
idx_sellerName (`sellerName` ASC)
idx_isSale_createDatetime_sellerName (`isSale` ASC, `createDatetime` ASC, `sellerName` ASC)
idx_createDatetime_isSale_sellerName (`createDatetime` ASC, `isSale` ASC, `sellerName` ASC)
idx_createDatetime_sellerName_isSale (`createDatetime` ASC, `sellerName` ASC, `isSale` ASC)

当使用EXPLAIN时在查询之前,为了检查它,我发现正在使用的索引是idx_createDatetime

当有更好的索引可以使用时,MySQL决定使用基本索引是否有一个特定的原因?

我一直认为这是一个bug。我还没有弄清楚如何写一个好的测试用例来"证明"。它。

Dropidx_isSale;那么它将使用idx_isSale_createDatetime_sellerName,这可能是最优的。

实际上,对于窄索引的任何使用都将由宽索引处理。

顺便说一句,如果开始包含将作为范围进行测试的列的复合索引很少有用。(即删除最后两个索引)