查詢沒有走索引 一文搞定聯合索引

2021-10-25 12:24:11 字數 2318 閱讀 6476

上文講解了索引的底層結構,但是留了乙個尾巴,就是沒有去講復合索引。今天來繼續梳理復合索引,所謂復合索引即是由多個字段組成的一條索引。

例如下表

create table `test` (

`id` int(4) not null auto_increment,

`a` varchar(10) not null,

`b` varchar(10) not null,

`c` varchar(10) not null,

`d` varchar(10) not null,

`e` varchar(10) not null,

primary key (`id`),

unique key `idx_a_b_c` (`a`,`b`,`c`) using btree

) engine=innodb auto_increment=4 default charset=utf8;

如下索引就是乙個聯合索引

idx_a_b_c(a,b,c) using btree
那麼怎麼樣的sql會走聯合索引呢????

答案是最左字首。

那麼!!!什麼又是最左字首?下面我們用sql的形式來進行案例講解。

sql 一

select  * from test where a = '333' and b = '333' and c = '333';
這個sql會不會走索引?我想你就是猜也肯定能猜到他會走吧,答案是會走,看下執行計畫

sql 二

select  * from test where a = '333' and b = '333';
這個sql會走復合索引嗎,答案是會,結論你先接著,最後會給大家分析。看下執行計畫

sql 三

select  * from test where a = '333' and c = '333';
這條sql同樣會走索引,也許這個時候你的內心會有乙個結論了,但是可能不對!看下執行計畫

sql 四

select  * from test where  b = '333' and c = '333';
這個sql會走索引嗎?你的答案是不是模糊了呢?看下執行計畫

答案是不會走聯合索引,至此我們來總結聯合索引的最左字首匹配,所謂最左字首匹配即是where條件必須有聯合索引的第乙個字段。

sql 五

select  * from test where c = '333' and b = '333' and a = '333';
這條sql會不會走聯合索引???看下執行計畫

明很顯走了索引,至此我們又得出乙個結論,聯合索引與where條件的順序無關

聯合索引的最左字首匹配指的是where條件一定要有聯合索引的第乙個字段

是否走聯合索引與where條件的順序無關,只與字段有關

聯合索引大致類似上面的b+樹結構,所以當索引的維護其實是以第乙個欄位來優先排序的,如果你的查詢條件裡沒有第乙個欄位就沒法通過索引比較來定位資料

覆蓋索引其實是一種特殊的聯合索引,怎麼理解呢,即是你查詢的字段的所有資料都在索引上,不需要再進行一次回表查詢,這樣的索引即為覆蓋索引。例如下sql即會走覆蓋索引

select a,b,c from test where a = '333';
​mysql b+樹索引

一文搞定聯合索引

聯合索引 上文講解了索引的底層結構,但是留了乙個尾巴,就是沒有去講復合索引。今天來繼續梳理復合索引,所謂復合索引即是由多個字段組成的一條索引。例如下表 create table test id int 4 notnull auto increment a varchar 10 not null b ...

一文看懂聚集索引和非聚集索引

聚集索引是指資料庫錶行中資料的物理順序與鍵值的邏輯 索引 順序相同。乙個表只能有乙個聚集索引,因為乙個表的物理順序只有一種情況,所以,對應的聚集索引只能有乙個。如果某索引不是聚集索引,則表中的行物理順序與索引順序不匹配,與非聚集索引相比,聚集索引有著更快的檢索速度。注意 聚集索引也稱為聚簇索引 cl...

一文搞懂MySQL字首索引

通常在開發中我們需要定義字串型別的字段,例如使用者名稱或者使用者郵箱等。假設我們在維護乙個使用者登入系統,使用者表的定義 create table user id bigint unsigned primary key,email varchar 64 engine innodb 如果使用郵箱登入的...