Mysql單表訪問方法,索引合并,多表連接原理,基于規則的優化,子查詢優化( 二 )


三丶索引合并通常情況下 , mysql只會為單個索引生成掃描區間 , 但是存在特殊情況 , mysql可以為多個索引生成掃描區間 , 這種多個索引生成掃描區間來完成依次查詢的方法稱為索引合并
1.交集索引合并select xxx ,xxx from table where key1=1 and key2=2 (key1和key2都是二級索引)mysql可以選擇使用key1 , 也可以使用key2索引 , 獲取符合的主鍵然后回表并過濾不符合的記錄 。也可以分別從key1索引中獲取滿足key1=1 , 從key2索引中獲取 key2=2的主鍵值 , 再獲取二者交集最后進行回表 , 這樣可與減少不必要的回表操作 。
使用交集索引合并的話 , 要求通過二級索引查到的主鍵本身就是有序的 , 這樣獲取交集效率更高 , 并且減少了隨機IO 。

  • 如果具有a,b兩個普通索引,執行查詢select * from table where a>1 and b=2 那么是無法進行交集索引合并的,因為a>1得到的主鍵并不是有序的 , 
  • 同樣聯合索引q,w,e 普通索引r 執行select * from table where q=1 and w=2 and r=3也不可以使用交集索引合并 , 因為聯合索引是依次根據q,w,e排序的 , 滿足q=1 and w=2的數據主鍵并不是有序的 。
  • 普通索引a , 主鍵為id , select * from a=1 and id>100這樣的查詢理論上是主鍵有序可與使用的 , 但是mysql會找到滿足a=1且id>100的第一條記錄 , 然后向右直到不符合條件的數據出現 , 這種情況也不需要使用交集索引合并
2.并集索引合并【Mysql單表訪問方法,索引合并,多表連接原理,基于規則的優化,子查詢優化】select * from table where a>1 or b>2 a,b均為普通索引 , 無法只使用a或者b索引進行查詢 , 但是可分別從a和b中獲取滿足條件的主鍵 , 然后取二者并集后回表即可 。這稱之為并集索引合并 , 同樣也是要求從單個索引獲取到的主鍵值是有序的 , 
3.排序并集索引合并并集索引合并要求根據單個索引獲取到的主鍵是有序的 , 然后取并集回表 , 條件比較苛刻 。mysql支持分別從各個索引中掃描得到記錄的主鍵讓排序 , 再取并集進行回標查詢 , 這種稱為排序并集索引合并
四丶連表查詢的原理上面我們研究了單表查詢 , 下面我們學習一下多表連接查詢
1.連接的本質連接的本質就是將各個表中的數據都取出來進行依次匹配 , 并且將匹配后的結果發送回客戶端 。無論那個表作為驅動表產生的笛卡爾積肯定是一樣的 , 而對于內連接來說凡是不符合on和where的查詢都不會加入到結果集 , 內連接的驅動表和被驅動表可以交換 , 但是對于外連接來說 , 驅動表中的記錄即使在被驅動表中找不到符合on的記錄 , 也會被加入到結果集 , 驅動表和被驅動表不可隨意交換
Mysql單表訪問方法,索引合并,多表連接原理,基于規則的優化,子查詢優化

文章插圖
2.連接中的過濾條件在連接時過濾掉特定的記錄是非常必要的(如果不進行過濾那么就是多表的笛卡爾積 , 條數是多個表條數的乘積)多表連接查詢中的過濾條件分為一下兩種