
上圖可以看到saleout 表擁有scroll_date 和 create_time 兩個索引;

當 order by 使用 create_time 進行降序的時候,發現其速度是4s多
explain 分析發現type為index key為 create_time 搜索了2387行;

但是 當 order by 使用 id 進行降序的時候,發現其速度是0.05s
explain 分析發現type為ref key 為 scroll_date 搜索了5000多行;

強制讓其走 scroll_date 效果就上來了,發現其速度是0.05s
explain 分析發現type為ref key 為 scroll_date 搜索了5000多行;和order by 使用Id的時候差不多一樣。
對比上面的結果可以發現:
索引為 scroll_date 的時候會比 create_time 快很多。
問題就來了:
1、既然 scroll_date 比create_time 快那么多,為啥mysql不走 scroll_date 而選擇create_time 的索引呢?
2、為啥使用order by create_time 的時候 mysql不是兩個索引都使用
uj5u.com熱心網友回復:
第二個問題很好回答。 你這個陳述句本身 mysql 是走不了兩個索引的。 要么照顧排序 走 create_time 但create_time 列索引 沒法實作對 scroll_date 的過濾。mysql 只有回表 進行過濾。 反之如果走scroll_date 那么就只有回表后 臨時表排序。第一個問題。看你的索引scroll_date 的區分度較差。估計mysql 認為我還是 照顧排序 然后回表過濾可能更好。。
-----如果僅僅針對你這個陳述句,那么 建一個 (status,scroll_date,create_time )的聯合索引,性能會非常非常好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/203019.html
標籤:疑難問題
