MySQL聯(lián)合索引遵循最左前綴匹配原則
面試官: 我看你的簡(jiǎn)歷上寫(xiě)著精通MySQL,問(wèn)你個(gè)簡(jiǎn)單的問(wèn)題,MySQL聯(lián)合索引有什么特性?
心想,這還不簡(jiǎn)單,這不是問(wèn)到我手心里了嗎?
聽(tīng)我給你背一遍八股文!
我: MySQL聯(lián)合索引遵循最左前綴匹配原則,即最左優(yōu)先,查詢(xún)的時(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)。
查詢(xún)條件中包含這些索引的時(shí)候,查詢(xún)就會(huì)用到索引。例如下面的查詢(xún)條件,就可以用到索引:
select * from table_name where a=?; select * from table_name where a=? and b=?; select * from table_name where a=? and b=? and c=?;
其他查詢(xún)條件不包含這些索引的語(yǔ)句,就不會(huì)用到索引,例如:
select * from table_name where b=?; select * from table_name where c=?; select * from table_name where b=? and c=?;
如果查詢(xún)條件包含(a,c),也會(huì)用到索引,相當(dāng)于用到了(a)索引。
面試官: 小伙子,你的八股文背的挺熟啊。
我: 也沒(méi)有辣,我只是平常熱愛(ài)學(xué)習(xí)知識(shí),經(jīng)常做一些總結(jié)匯總,所以就脫口而出了。
面試官: 別開(kāi)染坊了,我再問(wèn)你,MySQL聯(lián)合索引一定遵循最左前綴匹配原則嗎?
我擦,這把我問(wèn)的不自信了。
我: 嗯,MySQL聯(lián)合索引可能有時(shí)候不遵循最左前綴匹配原則。
面試官: 什么時(shí)候遵循?什么時(shí)候不遵循?
我: 可能是晴天遵循,下雨了就不遵循了,每個(gè)月那幾天不舒服的時(shí)候也不遵循了……
面試官: 今天面試就到這吧,你先回去等通知,有后續(xù)消息會(huì)聯(lián)系你的。
我擦,這叫什么問(wèn)題啊?
什么遵循不遵循?
難道是面試官跟我背的八股文不是同一套?
回去到MySQL官網(wǎng)上翻了一下,才發(fā)現(xiàn)面試官想問(wèn)的是索引跳躍掃描(Index Skip Scan) 。
MySQL8.0版本開(kāi)始增加了索引跳躍掃描的功能,當(dāng)?shù)谝涣兴饕奈ㄒ恢递^少時(shí),即使where條件沒(méi)有第一列索引,查詢(xún)的時(shí)候也可以用到聯(lián)合索引。
造點(diǎn)數(shù)據(jù)驗(yàn)證一下,先創(chuàng)建一張用戶(hù)表:
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='用戶(hù)表';
在性別和姓名兩個(gè)字段上(gender,name)建立聯(lián)合索引,性別字段只有兩個(gè)枚舉值。
執(zhí)行SQL查詢(xún)驗(yàn)證一下:
explain select * from user where name='一燈';

雖然SQL查詢(xún)條件只有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中進(jìn)行跨庫(kù)查詢(xún)的方法示例
這篇文章主要給大家介紹了關(guān)于MySQL中進(jìn)行跨庫(kù)查詢(xún)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Mysql中批量替換某個(gè)字段的部分?jǐn)?shù)據(jù)(推薦)
這篇文章主要介紹了Mysql中批量替換某個(gè)字段的部分?jǐn)?shù)據(jù),通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
MySQL 8.0新特性 — 檢查性約束的使用簡(jiǎn)介
這篇文章主要介紹了MySQL 8.0新特性 — 檢查性約束的簡(jiǎn)單介紹,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2021-03-03
MySQL Undo Log 配置及參數(shù)優(yōu)化與操作手冊(cè)詳解
不合理的 Undo Log配置會(huì)導(dǎo)致磁盤(pán)空間溢出、并發(fā)性能下降、數(shù)據(jù)泄露等問(wèn)題,本文基于MySQL 8.0+ 版本,詳解Undo Log關(guān)鍵配置參數(shù)、優(yōu)化方案與實(shí)操步驟,感興趣的朋友跟隨小編一起看看吧2026-02-02
mysql慢查詢(xún)優(yōu)化之從理論和實(shí)踐說(shuō)明limit的優(yōu)點(diǎn)
今天小編就為大家分享一篇關(guān)于mysql慢查詢(xún)優(yōu)化之從理論和實(shí)踐說(shuō)明limit的優(yōu)點(diǎn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
如何通過(guò)SQL找出2個(gè)表里值不同的列的方法
本篇文章對(duì)如何通過(guò)SQL找出2個(gè)表里值不同的列的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

