mysql組合索引的有序性

【推薦】如果有order by的場景,請注意利用索引的有序性。order by 最后的字段是組合索引的一部分,并且放在索引組合順序的最后,避免出現(xiàn)file_sort的情況,影響查詢性能。?

正例:where a=? and b=? order by c; 索引:a_b_c?

反例:索引中有范圍查找,那么索引有序性無法利用,如:WHERE a>10 ORDER BY b; 索引a_b無法排序。

解釋:order by的排序原理

1.利用索引的有序性獲取有序數(shù)據(jù)?

2.利用內(nèi)存/磁盤文件排序獲取結(jié)果?

1) 雙路排序:是首先根據(jù)相應的條件取出相應的排序字段和可以直接定位行數(shù)據(jù)的行指針信息,然后在sort buffer 中進行排序。?

2)單路排序:是一次性取出滿足條件行的所有字段,然后在sort buffer中進行排序。

組合索引的有序性和最左前綴原理

【強制】理解組合索引最左前綴原則,避免重復建設(shè)索引,如果建立了(a,b,c),相當于建立了(a), (a,b), (a,b,c)

假設(shè)有索引(A,B)?

mysql創(chuàng)建組合索引的規(guī)則是首先會對復合索引的最左邊的,也就是第一個A字段的數(shù)據(jù)進行排序,在第一個字段的排序基礎(chǔ)上,然后再對后面第二個的B字段進行排序。其實就相當于實現(xiàn)了類似 order by A B這樣一種排序規(guī)則。?

第一個A字段是絕對有序的,而第二字段就是無序的了。所以通常情況下,直接使用第二個B字段進行條件判斷是用不到索引的?

那么什么時候才能用到呢??

當然是B字段的索引數(shù)據(jù)也是有序的情況下才能使用。?

什么時候才是有序的呢??

只有在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——數(shù)據(jù)檢索和排序都在第一列

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

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的執(zhí)行過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容