如圖,這是一個含3個列的復合索引,使用到1.2.3個列的key_len分別是74、78、140圖中最后一條搜索中,由于中間列使用了范圍搜索,導致后面的索引失效,key_len是78,也就是最后一個列的索引沒用上。但我的問題是,為什么ref顯示的是NULL? 既然有一個列生效,那應該顯示一個const不是嗎?
1 回答

劉先森的貓
TA貢獻7條經驗 獲得超8個贊
這是一個好問題.
在第四次的explain sql時,注意看一個與前三次不同的細節(jié).
如圖,我用藍色標出來的部分.
type這一列,從ref變成了range.
先來回顧下type的作用.
????它顯示了連接使用了哪種類別,有無使用索引.
????從最好到最差的連接類型為: const > eq_reg > ref > range > indexhe > ALL
再來看看ref這一列的作用.
? ? 它顯示使用哪個列或常數(shù)與key一起從表中選擇行。?
在第一條到第三條sql時,Mysql查詢優(yōu)化器在比較 ref & range 的代價的時候,ref 的代價更小,所以選擇的是ref.
在第四條sql時,ref 與 range 使用的是相同的索引,ref key 的使用的長度小于 range 的長度,則優(yōu)先使用 range。
另外:
索引并沒有失效,第四條sql依然使用到了復合索引.
添加回答
舉報
0/150
提交
取消