mysql組合索引的有序性<轉>


昨天同事關於軍規里的一條mysql索引的問題咨詢我,才發現自己也不太了解組合索引的規則。於是來記錄一下:

【推薦】如果有order by的場景,請注意利用索引的有序性。order by 最后的字段是組合索引的一部分,並且放在索引組合順序的最后,避免出現file_sort的情況,影響查詢性能。
正例:where a=? and b=? order by c; 索引:a_b_c
反例:索引中有范圍查找,那么索引有序性無法利用,如:WHERE a>10 ORDER BY b; 索引a_b無法排序。

解釋:order by的排序原理
1.利用索引的有序性獲取有序數據
2.利用內存/磁盤文件排序獲取結果
1) 雙路排序:是首先根據相應的條件取出相應的排序字段和可以直接定位行數據的行指針信息,然后在sort buffer 中進行排序。
2)單路排序:是一次性取出滿足條件行的所有字段,然后在sort buffer中進行排序。

組合索引的有序性和最左前綴原理
【強制】理解組合索引最左前綴原則,避免重復建設索引,如果建立了(a,b,c),相當於建立了(a), (a,b), (a,b,c)

假設有索引(A,B)
mysql創建組合索引的規則是首先會對復合索引的最左邊的,也就是第一個A字段的數據進行排序,在第一個字段的排序基礎上,然后再對后面第二個的B字段進行排序。其實就相當於實現了類似 order by A B這樣一種排序規則。
第一個A字段是絕對有序的,而第二字段就是無序的了。所以通常情況下,直接使用第二個B字段進行條件判斷是用不到索引的
那么什么時候才能用到呢?
當然是B字段的索引數據也是有序的情況下才能使用。
什么時候才是有序的呢?
只有在A字段是等值匹配的情況下,B才是有序的。

組合索引查詢的各種場景
有 Index (A,B,C) ——組合索引多字段是有序的,並且是個完整的BTree 索引。

下面條件可以用上該組合索引查詢:

A>5

A=5 AND B>6

A=5 AND B=6 AND C=7

A=5 AND B IN (2,3) AND C>5

下面條件將不能用上組合索引查詢:

B>5 ——查詢條件不包含組合索引首列字段

B=6 AND C=7 ——查詢條件不包含組合索引首列字段

下面條件將能用上部分組合索引查詢:

A>5 AND B=2 ——當范圍查詢使用第一列,查詢條件僅僅能使用第一列

A=5 AND B>6 AND C=2 ——范圍查詢使用第二列,查詢條件僅僅能使用前二列

組合索引排序的各種場景
有組合索引 Index(A,B)。

下面條件可以用上組合索引排序:

ORDER BY A——首列排序

A=5 ORDER BY B——第一列過濾后第二列排序

ORDER BY A DESC, B DESC——注意,此時兩列以相同順序排序

A>5 ORDER BY A——數據檢索和排序都在第一列

下面條件不能用上組合索引排序:

ORDER BY B ——排序在索引的第二列

A>5 ORDER BY B ——范圍查詢在第一列,排序在第二列

A IN(1,2) ORDER BY B ——理由同上

ORDER BY A ASC, B DESC ——注意,此時兩列以不同順序排序

建議
如果對有沒有用上索引有疑惑可以寫完sql以后 用explain 來運行一下sql
可以更有利於理解sql的執行過程

轉自:https://blog.csdn.net/u013705066/article/details/82257099


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM