ALL
全表掃描
Index
索引表全表掃描,其性能不會比ALL高,因爲它實際還是會回表查數據的,每在索引表中查一條索引就回主表查一次數據
除非是排序情況,因爲聚集索引是按照主鍵排序的,而其他索引是根據索引的列排序的。如果是需要列排序,Index纔會比ALL快,因爲免除了一次排序。
什麼時候會出現index情況?一般需要查詢的列都處在索引中時,會走index,因爲要查的數據都在索引中,因此直接在索引中查即可,不需要回主表查,但如果不存在排序的話,效率跟ALL沒區別
range
這種情況會計算出一個索引範圍,只查詢這個範圍內的索引(只會在這個範圍內回表查)。
範圍計算的規則是基於最左匹配的,遇到不在索引中的,或者範圍查詢時,範圍限定就此終結,如果後面的列仍在索引中,其會起到過濾的作用,雖然不會減小索引的範圍,但能夠阻止多餘的回表查詢。
舉個例子:
index(a,b,c)
where a = 1 and b > 3 and c=4
以上只有a,b能縮小索引範圍,而c雖然不能縮小要查詢的索引的範圍,但當掃描索引中c!=4
的記錄時將不會進行回表查數據,而回表是主要性能瓶頸,因此c同樣很重要
Ref
查找條件使用索引但使用的不是唯一索引或主鍵索引,因此可能會存在多個記錄。但範圍很小,其與range的區別如下:
range:
where a = 1 and b > 3
對應的索引爲a = 1 and b = 4,a = 1 and b = 5,a = 1 and b = 6……, 其中每條都可能對應着多個主鍵記錄
ref:
where a = 1 and b = 3
對應的索引爲a = 1 and b = 3,其對應的主鍵記錄可能有多條
對於非唯一索引,其存儲結構爲跟着多條主鍵所在頁號
Ref-eq
其與Ref的區別爲,結果集只有一條,即對應的主鍵記錄只存在一條,通常是使用了主鍵和唯一索引,主要在表連接的時候出現,如使用主鍵進行連接的情況。單表一邊會出現const
const
最好的情況,如果where後存在主鍵或者唯一索引的等值查詢,將能夠定位到這條唯一的記錄,只會查一次
where id = 1
額外
對於where查詢,不需要根據索引中列順序來,因爲優化器會自動優化順序,使用索引
where a=1 and b=1
where b=1 and a=1
以上兩個沒區別,因此對於索引(a,b)無論哪個語句都能使用索引
因此,where中的列的順序是無關的,因爲無論怎麼換都不影響,我們進行最左匹配原則的時候的最左匹配看的是索引中的列的順序。
where a = 1 and b > 10
where b > 10 and a = 1
對於索引(a,b)以上都能使用到a和b,但對於索引(b,a),則只能使用到索引b,因爲b是範圍查詢
參考:
https://blog.csdn.net/dennis211/article/details/78170079