最近在看到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 姓名 ...