亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mysql聯(lián)合索引最左匹配原則的底層實現(xiàn)原理解讀

 更新時間:2023年09月28日 09:28:00   作者:weixin_43831204  
這篇文章主要介紹了mysql聯(lián)合索引最左匹配原則的底層實現(xiàn)原理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

mysql聯(lián)合索引最左匹配原則的底層實現(xiàn)原理

要看懂,需要熟悉mysql b+ tree的數(shù)據(jù)結構

b+tree的葉節(jié)點和葉子節(jié)點的排序特性是按照,從小到大,從左到右的這么一個規(guī)則,int直接比大小,uuid比較ASCII碼,

  • 聯(lián)合索引的排序規(guī)則
  • 拿a_b_c_idx為例,優(yōu)先比較a列的大小,如果a列的大小相等,才會去看b列的大小,否則直接按照a列排序,以此類推.
  • 假如直接拿 b='xxx’作為條件
  • 在遍歷索引樹的時候,到頁子節(jié)點,不能保證索引的順序,還是要去全文遍歷其他的葉子結點

例子

假如建立聯(lián)合索引(a,b,c)

1.全值匹配查詢時

用到了索引

where子句幾個搜索條件順序調(diào)換不影響查詢結果,因為Mysql中有查詢優(yōu)化器,會自動優(yōu)化查詢順序

select * from table_name where a = '1' and b = '2' and c = '3' 
select * from table_name where b = '2' and a = '1' and c = '3' 
select * from table_name where c = '3' and b = '2' and a = '1' 

2.匹配左邊的列時

都從最左邊開始連續(xù)匹配,用到了索引

select * from table_name where a = '1' 
select * from table_name where a = '1' and b = '2'  
select * from table_name where a = '1' and b = '2' and c = '3'

這些沒有從最左邊開始,最后查詢沒有用到索引,用的是全表掃描

select * from table_name where  b = '2' 
select * from table_name where  c = '3'
select * from table_name where  b = '1' and c = '3' 

如果不連續(xù)時,只用到了a列的索引,b列和c列都沒有用到

select * from table_name where a = '1' and c = '3' 

3.匹配列前綴

如果列是字符型的話它的比較規(guī)則是先比較字符串的第一個字符,第一個字符小的那個字符串就比較小,如果兩個字符串第一個字符相通,那就再比較第二個字符,第二個字符比較小的那個字符串就比較小,依次類推,比較字符串。

如果a是字符類型,那么前綴匹配用的是索引,后綴和中綴只能全表掃描了

select * from table_name where a like 'As%'; //前綴都是排好序的,走索引查詢
select * from table_name where  a like '%As'//全表查詢
select * from table_name where  a like '%As%'//全表查詢

4 .匹配范圍值

可以對最左邊的列進行范圍查詢

select * from table_name where  a > 1 and a < 3

多個列同時進行范圍查找時,只有對索引最左邊的那個列進行范圍查找才用到B+樹索引,也就是只有a用到索引,在1<a<3的范圍內(nèi)b是無序的,不能用索引,找到1<a<3的記錄后,只能根據(jù)條件 b > 1繼續(xù)逐條過濾

select * from table_name where  a > 1 and a < 3 and b > 1;

5.精確匹配某一列并范圍匹配另外一列

如果左邊的列是精確查找的,右邊的列可以進行范圍查找

select * from table_name where  a = 1 and b > 3;

a=1的情況下b是有序的,進行范圍查找走的是聯(lián)合索引

6.排序

order by的子句后面的順序也必須按照索引列的順序給出,比如

select * from table_name order by a,b,c limit 10;

這種顛倒順序的沒有用到索引

select * from table_name order by b,c,a limit 10;

這種用到部分索引

select * from table_name order by a limit 10;
select * from table_name order by a,b limit 10;

聯(lián)合索引左邊列為常量,后邊的列排序可以用到索引

select * from table_name where a =1 order by b,c limit 10;

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論