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=?;
其他查詢條件不包含這些索引的語句,就不會(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)系你的。
我擦,這叫什么問題?。?/p>
什么遵循不遵循?
難道是面試官跟我背的八股文不是同一套?
回去到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í)候遇到第一列索引就跳過,直接匹配第二列索引的值,這樣就可以用到聯(lián)合索引了。
其實(shí)我們優(yōu)化一下SQL,把第一列的所有枚舉值加到where條件中,也可以用到聯(lián)合索引:
select * from user where gender in (0,1) and name='一燈';
看來還是需要經(jīng)常更新自己的知識(shí)體系,一不留神就out了!
到此這篇關(guān)于MySQL聯(lián)合索引遵循最左前綴匹配原則的文章就介紹到這了,更多相關(guān)MySQL聯(lián)合索引遵內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql數(shù)據(jù)表分區(qū)技術(shù)PARTITION淺析
這篇文章主要介紹了Mysql數(shù)據(jù)表分區(qū)技術(shù)PARTITION淺析,分別介紹了 Mysql 中的分區(qū)技術(shù) RANGE、LIST、 HASH,需要的朋友可以參考下2014-06-06
mysql中ALTER AGGREGATE使用場(chǎng)景小結(jié)
ALTER AGGREGATE?是 SQL 中用于修改已定義聚合函數(shù)的語法,本文主要介紹了mysql中ALTER AGGREGATE使用場(chǎng)景小結(jié),具有一定的的參考價(jià)值,感興趣的可以了解一下2025-05-05
關(guān)于MySQL的整型數(shù)據(jù)的內(nèi)存溢出問題的應(yīng)對(duì)方法
這篇文章主要介紹了關(guān)于MySQL的整型數(shù)據(jù)的內(nèi)存溢出問題的應(yīng)對(duì)方法,作者還列出了MySQL所支持的整型數(shù)據(jù)的存儲(chǔ)空間支持大小,需要的朋友可以參考下2015-05-05
Navicat無法連接MySQL報(bào)錯(cuò)1251的解決方案
這篇文章主要為大家詳細(xì)介紹了Navicat無法連接MySQL報(bào)錯(cuò)1251的解決方案,文中解決方法介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-12-12
MySQL數(shù)據(jù)庫讀寫分離與負(fù)載均衡的實(shí)現(xiàn)邏輯
讀寫分離與負(fù)載均衡是數(shù)據(jù)庫優(yōu)化的關(guān)鍵策略,讀寫分離的核心是將數(shù)據(jù)庫的讀操作與寫操作分離,本文給大家介紹MySQL數(shù)據(jù)庫讀寫分離與負(fù)載均衡的實(shí)現(xiàn)方式,感興趣的朋友一起看看吧2025-11-11
mysql查看,創(chuàng)建,授權(quán),刪除用戶的實(shí)現(xiàn)方式
這篇文章主要介紹了mysql查看,創(chuàng)建,授權(quán),刪除用戶的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
MySQL解決Navicat設(shè)置默認(rèn)字符串時(shí)的報(bào)錯(cuò)問題
本文主要介紹了MySQL解決Navicat設(shè)置默認(rèn)字符串時(shí)的報(bào)錯(cuò),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

