日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql索引是有序的吗_mysql组合索引的有序性转

發布時間:2023/12/10 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql索引是有序的吗_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的執行過程

總結

以上是生活随笔為你收集整理的Mysql索引是有序的吗_mysql组合索引的有序性转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。