mysql索引最左匹配原則的理解

2021-10-06 19:32:19 字數 2162 閱讀 3622

最近在看到mysql聯合索引的匹配原則,記錄下自己的理解

一、建立一張表

create table test(

a int ,

b int,

c int,

d int,

key index_abc(a,b,c)

)engine=innodb default charset=utf8;

二、插入一些資料進去

drop procedure if exists proc_initdata;

delimiter $

create procedure proc_initdata()

begin

declare i int default 1;

while i<=10000 do

insert into test(a,b,c,d) values(i,i,i,i);

set i = i+1;

end while;

end $

call proc_initdata();

三、走索引的查詢語句

四、不走索引的語句

總結:為什麼 b<10 and c <10,沒有用到索引?而 a<10 and c <10用到了?

當b+樹的資料項是復合的資料結構,比如(name,age,***)的時候,b+數是按照從左到右的順序來建立搜尋樹的,比如當(張三,20,f)這樣的資料來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和***,最後得到檢索的資料;但當(20,f)這樣的沒有name的資料來的時候,b+樹就不知道下一步該查哪個節點,因為建立搜尋樹的時候name就是第乙個比較因子,必須要先根據name來搜尋才能知道下一步去**查詢。比如當(張三,f)這樣的資料來檢索時,b+樹可以用name來指定搜尋方向,但下乙個欄位age的缺失,所以只能把名字等於張三的資料都找到,然後再匹配性別是f的資料了, 這個是非常重要的性質,即索引的最左匹配特性。

重點:在此需要注意一點,如果乙個表中有三個欄位a、b、c三個欄位且這三個字段組成乙個聯合索引abc,則在查詢的時候可能會都走索引

explain select * from test where a<10 ;

explain select * from test where a<10 and b <10;

explain select * from test where a<10 and b <10 and c<10;

explain select * from test where b<10 and a <10;

explain select * from test where b<10 and a <10 and c<10;

explain select * from test where a<10 and c <10;

只要查詢語句帶最左邊的字段則走索引

參考部落格:

MySQL索引 最左匹配原則

表結構,有三個字段,分別是id,name,cid create table student id int 11 not null auto increment,name varchar 255 default null,cid int 11 default null,primary key id k...

mysql取締最左匹配原則 最左匹配原則

一 這條sql語句select from dept where age 12 and name like a 雖然age條件在前,name在後,看似不滿足最左側原則,但這條語句在執行的過程中mysql優化器會將該條語句優化為select from dept where name like a and...

Mysql 聯合索引最左匹配原則

二 測試現象 drop table if exists test table create table test table id int 11 not null auto increment comment 編號 namee varchar 255 default null comment 姓名 ...