Mysql的Explain中的type分析

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章