MySQL聯(lián)合索引遵循最左前綴匹配原則
面試官: 我看你的簡(jiǎn)歷上寫著精通MySQL,問你個(gè)簡(jiǎn)單的問題,MySQL聯(lián)合索引有什么特性?
心想,這還不簡(jiǎn)單,這不是問到我手心里了嗎?
聽我給你背一遍八股文!
我: MySQL聯(lián)合索引遵循最左前綴匹配原則,即最左優(yōu)先,查詢的時(shí)候會(huì)優(yōu)先匹配最左邊的索引。
例如當(dāng)我們?cè)?nbsp;(a,b,c) 三個(gè)字段上創(chuàng)建聯(lián)合索引時(shí),實(shí)際上是創(chuàng)建了三個(gè)索引,分別是(a)、(a,b)、(a,b,c)。
查詢條件中包含這些索引的時(shí)候,查詢就會(huì)用到索引。例如下面的查詢條件,就可以用到索引:
select * from table_name where a=?; select * from table_name where a=? and b=?; select * from table_name where a=? and b=? and c=?;
其他查詢條件不包含這些索引的語(yǔ)句,就不會(huì)用到索引,例如:
select * from table_name where b=?; select * from table_name where c=?; select * from table_name where b=? and c=?;
如果查詢條件包含(a,c),也會(huì)用到索引,相當(dāng)于用到了(a)索引。
面試官: 小伙子,你的八股文背的挺熟啊。
我: 也沒有辣,我只是平常熱愛學(xué)習(xí)知識(shí),經(jīng)常做一些總結(jié)匯總,所以就脫口而出了。
面試官: 別開染坊了,我再問你,MySQL聯(lián)合索引一定遵循最左前綴匹配原則嗎?
我擦,這把我問的不自信了。
我: 嗯,MySQL聯(lián)合索引可能有時(shí)候不遵循最左前綴匹配原則。
面試官: 什么時(shí)候遵循?什么時(shí)候不遵循?
我: 可能是晴天遵循,下雨了就不遵循了,每個(gè)月那幾天不舒服的時(shí)候也不遵循了……
面試官: 今天面試就到這吧,你先回去等通知,有后續(xù)消息會(huì)聯(lián)系你的。
我擦,這叫什么問題啊?
什么遵循不遵循?
難道是面試官跟我背的八股文不是同一套?
回去到MySQL官網(wǎng)上翻了一下,才發(fā)現(xiàn)面試官想問的是索引跳躍掃描(Index Skip Scan) 。
MySQL8.0版本開始增加了索引跳躍掃描的功能,當(dāng)?shù)谝涣兴饕奈ㄒ恢递^少時(shí),即使where條件沒有第一列索引,查詢的時(shí)候也可以用到聯(lián)合索引。
造點(diǎn)數(shù)據(jù)驗(yàn)證一下,先創(chuàng)建一張用戶表:
CREATE TABLE `user` ( ?`id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵', ?`name` varchar(255) NOT NULL COMMENT '姓名', ?`gender` tinyint NOT NULL COMMENT '性別', ?PRIMARY KEY (`id`), ?KEY `idx_gender_name` (`gender`,`name`) ) ENGINE=InnoDB COMMENT='用戶表';
在性別和姓名兩個(gè)字段上(gender
,name
)建立聯(lián)合索引,性別字段只有兩個(gè)枚舉值。
執(zhí)行SQL查詢驗(yàn)證一下:
explain select * from user where name='一燈';
雖然SQL查詢條件只有name字段,但是從執(zhí)行計(jì)劃中看到依然是用了聯(lián)合索引。
并且Extra列中顯示增加了Using index for skip scan,表示用到了索引跳躍掃描的優(yōu)化邏輯。
具體優(yōu)化方式,就是匹配的時(shí)候遇到第一列索引就跳過(guò),直接匹配第二列索引的值,這樣就可以用到聯(lián)合索引了。
其實(shí)我們優(yōu)化一下SQL,把第一列的所有枚舉值加到where條件中,也可以用到聯(lián)合索引:
select * from user where gender in (0,1) and name='一燈';
看來(lái)還是需要經(jīng)常更新自己的知識(shí)體系,一不留神就out了!
到此這篇關(guān)于MySQL聯(lián)合索引遵循最左前綴匹配原則的文章就介紹到這了,更多相關(guān)MySQL聯(lián)合索引遵內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入研究mysql中的varchar和limit(容易被忽略的知識(shí))
這篇文章主要介紹了深入研究mysql中的varchar和limit(容易被忽略的知識(shí)),本文探究了varchar(5)可以存儲(chǔ)多少個(gè)漢字、多少個(gè)字母數(shù)字和mysql中的limit你真的會(huì)用嗎兩個(gè)知識(shí)點(diǎn),需要的朋友可以參考下2015-03-03MySQL最大連接數(shù)max_connections設(shè)置的兩種方法
MySQL的最大連接數(shù)可以通過(guò)兩種方法進(jìn)行設(shè)置,通過(guò)命令行臨時(shí)修改和通過(guò)配置文件永久修改這兩種方法,本文將通過(guò)代碼示例給大家詳細(xì)的講解一下這兩種方法,需要的朋友可以參考下2024-05-05MYSQL數(shù)據(jù)庫(kù)連接池及常見參數(shù)調(diào)優(yōu)方式
這篇文章主要介紹了MYSQL數(shù)據(jù)庫(kù)連接池及常見參數(shù)調(diào)優(yōu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06關(guān)于MySQL的索引之最左前綴優(yōu)化詳解
這篇文章主要介紹了關(guān)于MySQL的索引之最左前綴優(yōu)化詳解,多個(gè)普通字段組合在一起創(chuàng)建的索引叫做聯(lián)合索引, 也被稱之為組合索引,需要的朋友可以參考下2023-05-05MySQL主從復(fù)制的原理圖解及Java語(yǔ)言示例使用
這篇文章主要介紹了MySQL的主從復(fù)制原理詳細(xì)分析,讀寫分離是基于主從復(fù)制來(lái)實(shí)現(xiàn)的。文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08MySQL常見錯(cuò)誤有哪些_MySQL常見錯(cuò)誤的快速解決方法
MySQL常見錯(cuò)誤有哪些呢?下面小編就為大家?guī)?lái)一篇MySQL常見錯(cuò)誤的快速解決方法?,F(xiàn)在分享個(gè)大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-03-03MySQL5.7并行復(fù)制原理及實(shí)現(xiàn)
MySQL 5.7并行復(fù)制的思想簡(jiǎn)單易懂,本文就詳細(xì)的介紹了MySQL5.7并行復(fù)制原理及實(shí)現(xiàn),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06