![](/img/trans.png)
[英]Why my MySQL composite index has less Cardinality than a single index on the same column?
[英]Why is MySQL preferring a single index over a composite index?
我目前有這個查詢:
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 決定使用基本索引是否有特定的原因?
我一直認為這是一個錯誤。 我還沒有想出如何編寫一個好的測試用例來“證明”它。
刪除idx_isSale
; 然后它將使用idx_isSale_createDatetime_sellerName
,這可能是最佳的。
實際上,較窄索引的任何使用都將由較寬索引處理。
順便說一句,使用將作為范圍進行測試的列來啟動復合索引很少有用。 (也就是說,刪除最后兩個索引。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.