聯合索引
上文講解了索引的底層結構,但是留了乙個尾巴,就是沒有去講復合索引。今天來繼續梳理復合索引,所謂復合索引即是由多個字段組成的一條索引。
例如下表
create
table
`test`
(`id`
int(4)
notnull
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;
如下索引就是乙個聯合索引
那麼怎麼樣的sql會走聯合索引呢????idx_a_b_c
(a
,b
,c
) using btree
答案是最左字首。
那麼!!!什麼又是最左字首?下面我們用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即會走覆蓋索引
查詢沒有走索引 一文搞定聯合索引
上文講解了索引的底層結構,但是留了乙個尾巴,就是沒有去講復合索引。今天來繼續梳理復合索引,所謂復合索引即是由多個字段組成的一條索引。例如下表 create table test id int 4 not null auto increment,a varchar 10 not null,b varc...
一文搞定babel轉換
code轉換為ast 遍歷ast樹 進行修改 還原為code targets支援哪些瀏覽器 babel polyfill是將整個es2015 環境引入到全域性中,會造成全域性汙染require core js modules set 改變了原型,所以可以在例項上使用方法 通過配置usebuiltin...
一文搞定開發學習環境
剛開始學寫 首先要搭建開發環境。新手需要在網上查閱教程,很多時候會遇到各種問題,甚至導致自己的學習進度卡住,學習熱情也因此而減少,這實在是個讓人煩的事情。我們可以簡單分析原因,並慢慢減少此類問題的發生。搭建開發環境經常出錯的原因 1.開發環境不匹配 我們在學習或者實際的開發中,有多種開發平台,比如w...