MySQL查詢的本質——單表與多表的查詢方法
阿新 • • 發佈:2021-11-24
單表查詢
單表查詢的語句實際上是一種宣告式的語法,只是告訴MySQL要獲取的資料符合哪些規則,至於具體的執行方式是MySQL自己來定。針對不同的場景,也有不同的執行計劃:
const
通過主鍵或者唯一二級索引與常數的等值比較來定位一條記錄,是最快的執行方式。主鍵定位直接返回,而唯一二級索引只需查詢一次+回表一次即可返回
ref
較為常見的,在建立二級索引後直接使用其為等值查詢條件。因為是等值的,索引會形成單點掃描區間。這種方法稱為ref,規則是:搜尋條件為二級索引列與常數進行等值比較,形成的掃描區間為單點掃描區間,採用二級索引來執行查詢。這種方式的缺點就是每查到一次就回表一次,消耗大。
全表掃描,適用於所有查詢,但缺點就是慢
注意:
一般來說,具體使用哪種方法來執行,是MySQL中優化器的工作,它會訪問表中少量資料獲等方式,分析出多種執行計劃中成本最小的來查詢。
一般來說,使用二級索引查詢時,當拿到匹配的二級記錄後,就算還有其他匹配條件,也會先根據結果(主鍵)執行回表操作,再檢測該記錄是否滿足其他條件,滿足則傳送給客戶端,不滿足則忽略。
index_merge
索引合併。使用多個索引來完成一次查詢,有以下三種方式:
- 且當二級索引列允許儲存null時,都是用此ref方式訪問。
- ref允許最左匹配機制,即最左連續列匹配聯合索引,就可以使用ref
- 當查詢條件不為等值時不能用ref
- Intersection索引合併
- 首先,是全表就不談了,慢。
- 其次,是使用key1的索引查詢,則掃描區間為['a','a'],查詢到之後立刻回表,再匹配key3。
- 然後,是按照key3的索引查詢,同樣的則掃描區間為['b','b'],查詢到之後立刻回表,再匹配key1
- 最後,同時使用key1和key3的索引查詢。在key1索引中掃描出匹配key1=a的記錄,在key3索引中掃描出匹配key1=b的記錄。由於在普通二級索引中,重複的索引值會按照主鍵來排序。所以在這個執行計劃中,使用各自的索引掃描出來的記錄也是主鍵排序的。又因為這裡使用了 AND,需要查詢兩者條件都匹配的結果,所以找出兩者查詢的結果中主鍵相同的記錄,再使用這些相同的主鍵一併執行回表,這樣可能會省下很多回錶帶來的開銷。這就是Intersection索引合併,它要求二級索引是排序的,也就是說我們的查詢條件必須是等值的,只有等值才會排序。如果不使用等值條件,則不會使用Intersection索引合併(相當於各自使用ref,最後取重複集)
- Union索引合併
- Sort-Union索引合併
- 單表限制條件。如:key=3或key>1或key<4。只針對key所在的表的限制條件
- 多表限制條件。如:t1.m1=t2.m1、t1.n1<t2.n2。就針對了t1和t2兩個表的限制條件。
- WHERE:不分內外連線,只要不匹配WHERE子句的條件,就不加入結果集。
- ON:
- 對於外連線的驅動表來說,如果在被驅動表中找不到匹配ON子句的過濾條件,驅動表的記錄還是會加入結果集,被驅動表找不到記錄沒有關係,填NULL即可。
- 對於內連線的驅動表來說,ON等效於WHERE。