mysql索引最左原則

2021-09-25 16:02:52 字數 1277 閱讀 7391

create table `user` (

`id` int(10) unsigned not null auto_increment,

`name` varchar(10) default null,

`***` tinyint(1) default null,

`age` tinyint(2) default null,

primary key (`id`),

key `index_user` (`name`,`age`) using btree

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

explain  select * from `user` where name="tom" \g
命中索引

explain  select * from `user` where age=18 and name="tom" \g
命中索引(跟sqlwhere條件的順序無關)

explain  select * from `user` where age=18 \g
不命中索引

explain  select * from `user` where name="tom" and age=18 \g
命中索引

最左原則是索引的第乙個元素必須在where的條件中有才行,where條件的索引不在首位也沒關係,如where age=18 and name='***' ,name是user表的聯合索引之一,就可以命中。如果where age=18不能命中索引,因為user表的聯合索引第乙個元素是name,在where條件需要出現name才會命中索引。

由此可見,只有sql中where包含聯合索引的首個欄位的查詢才能命中索引,這個叫索引的最左匹配特性。 聯合索引的使用在寫where條件的順序無關,mysql查詢分析會進行優化而使用索引。但是減輕查詢分析器的壓力,最好和索引的從左到右的順序一致。

b+樹的資料項是復合的資料結構,比如(name,age,***)的時候,b+樹是按照從左到右的順序來建立搜尋樹的,比如當(張三,20,f)這樣的資料來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和***,最後得到檢索的資料;但當(20,f)這樣的沒有name的資料來的時候,b+樹就不知道第一步該查哪個節點,因為建立搜尋樹的時候name就是第乙個比較因子,必須要先根據name來搜尋才能知道下一步去**查詢。

mysql 索引最左原則原理

索引本質是一棵b tree,聯合索引 col1,col2,col3 也是。其非葉子節點儲存的是第乙個關鍵字的索引,而葉節點儲存的則是三個關鍵字col1 col2 col3三個關鍵字的資料,且按照col1 col2 col3的順序進行排序。圖以innodb引擎為例,對應位址指的是資料記錄的位址 聯合索...

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組合索引之最左原則

為什麼在單列索引的基礎上還需要組合索引?我們當然每個欄位都可以建立索引 在不建立組合索引的前提下 mysql只會用到其中乙個最有效率的索引 效率平庸 但當我們建了組合索引後 btree索引結構下 當我們建立了組合索引prodect id,order id後像上面的語句 我們可以直接根據order i...