最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql左匹配規(guī)則的實(shí)現(xiàn)

 更新時(shí)間:2026年03月23日 08:27:48   作者:身如柳絮隨風(fēng)揚(yáng)  
本文主要介紹了mysql左匹配規(guī)則的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在數(shù)據(jù)庫(kù)性能優(yōu)化的世界里,索引就像一本書(shū)的目錄,能讓你瞬間定位到所需數(shù)據(jù)。然而,很多開(kāi)發(fā)者雖然創(chuàng)建了索引,卻發(fā)現(xiàn)查詢(xún)依然緩慢——問(wèn)題往往出在沒(méi)有遵循左匹配規(guī)則

左匹配規(guī)則(又稱(chēng)最左前綴原則)是復(fù)合索引使用的核心準(zhǔn)則。今天,我們就通過(guò)生動(dòng)的類(lèi)比、詳細(xì)的示例和實(shí)戰(zhàn)技巧,徹底搞懂它。

什么是左匹配規(guī)則?

簡(jiǎn)單來(lái)說(shuō),左匹配規(guī)則指的是:

對(duì)于一個(gè)復(fù)合索引(如 (A, B, C)),只有當(dāng)查詢(xún)條件中使用了索引定義中從最左邊開(kāi)始連續(xù)的一列或多列時(shí),索引才能被高效利用。

換句話說(shuō),你不能跳過(guò)左邊的列直接使用右邊的列,也不能只使用中間或右邊的列。就像爬樓梯,你必須從第一級(jí)開(kāi)始,一階一階往上,不能直接跳到第三級(jí)。

為什么會(huì)有這個(gè)規(guī)則?——B+樹(shù)的秘密

復(fù)合索引的底層數(shù)據(jù)結(jié)構(gòu)通常是 B+樹(shù),它按照索引定義的列順序進(jìn)行排序和存儲(chǔ):

  • 首先按第一列排序;
  • 第一列相同,再按第二列排序;
  • 第二列相同,再按第三列排序,以此類(lèi)推。

這就形成了一種層級(jí)有序的結(jié)構(gòu)。只有從最左邊開(kāi)始連續(xù)匹配,才能利用這種有序性進(jìn)行快速二分查找。
類(lèi)比電話簿:電話簿先按姓氏排序,姓氏相同再按名字排序。如果你只知道名字“John”,而不知道姓氏,就無(wú)法快速定位——因?yàn)樗薪?ldquo;John”的人分散在整個(gè)電話簿中。

實(shí)戰(zhàn)示例:一張表帶你徹底理解

假設(shè)我們有一張用戶(hù)表 user,并創(chuàng)建了復(fù)合索引:

CREATE INDEX idx_name_age_city ON user(name, age, city);

索引列順序:nameagecity。

? 有效利用索引的情況(遵循左匹配)

1. 完全使用最左邊一列

SELECT * FROM user WHERE name = '張三';

?? 索引從 name 開(kāi)始,完美命中。

2. 連續(xù)使用多列

SELECT * FROM user WHERE name = '張三' AND age = 25;
SELECT * FROM user WHERE name = '張三' AND age = 25 AND city = '北京';

?? 連續(xù)使用了前兩列或全部三列,索引發(fā)揮最大功效。

3. 部分連續(xù)匹配(中間跳過(guò))

SELECT * FROM user WHERE name = '張三' AND city = '北京';

?? name 能用到索引,但 city 無(wú)法直接利用(因?yàn)樘^(guò)了 age,在索引中 city 是無(wú)序的)。
數(shù)據(jù)庫(kù)會(huì)先用索引快速定位所有 name='張三' 的記錄,再在這些記錄中過(guò)濾 city='北京'。雖然不如全匹配快,但已經(jīng)比全表掃描好多了。

? 索引失效或低效的情況(違反左匹配)

1. 未從最左邊開(kāi)始

SELECT * FROM user WHERE age = 25;
SELECT * FROM user WHERE city = '北京';
SELECT * FROM user WHERE age = 25 AND city = '北京';

?? 查詢(xún)條件中沒(méi)有使用第一列 name,就像在電話簿中直接找年齡25歲的人——索引無(wú)法用于快速定位,通常導(dǎo)致全表掃描。

2. 范圍查詢(xún)打斷連續(xù)性

SELECT * FROM user WHERE name = '張三' AND age > 20 AND city = '北京';

?? nameage 能用索引(age 用于范圍查找),但 city 無(wú)法在索引中精確匹配。因?yàn)?age 的范圍查詢(xún)使得 city 的順序不再保證,city 條件只能在索引過(guò)濾后的結(jié)果集中進(jìn)行額外過(guò)濾。

特殊場(chǎng)景與注意事項(xiàng)

1.LIKE模糊匹配:只有左前綴才能用索引

SELECT * FROM user WHERE name LIKE '張%';   -- ? 能用索引(相當(dāng)于范圍查詢(xún))
SELECT * FROM user WHERE name LIKE '%三';   -- ? 無(wú)法使用索引
SELECT * FROM user WHERE name LIKE '%三%';  -- ? 無(wú)法使用索引

因?yàn)?% 開(kāi)頭意味著不知道字符串的起始字符,無(wú)法在B+樹(shù)上進(jìn)行二分查找。

2. 覆蓋索引:有時(shí)可以“繞過(guò)”規(guī)則

如果查詢(xún)的字段全部包含在索引中(例如 SELECT name, age FROM user WHERE age = 25),雖然 WHERE 條件未遵循左匹配,但數(shù)據(jù)庫(kù)可能選擇掃描整個(gè)索引來(lái)獲取數(shù)據(jù)(索引覆蓋掃描)。這比全表掃描快,但仍不如直接命中索引高效——屬于“無(wú)奈之舉”。

3. 索引列順序的設(shè)計(jì)原則

創(chuàng)建復(fù)合索引時(shí),應(yīng)將最常用于查詢(xún)條件、區(qū)分度最高的列放在最左邊。例如,如果業(yè)務(wù)中90%的查詢(xún)都帶 name 條件,那么 name 就應(yīng)該放在第一位。

總結(jié):左匹配規(guī)則三句話

  1. 帶頭大哥不能丟
    查詢(xún)條件必須包含索引最左邊的列。

  2. 中間兄弟不能斷
    如果使用了索引中的多列,中間列不能被跳過(guò)。

  3. 范圍之后全失效
    索引列上的范圍查詢(xún)會(huì)讓其后的索引列無(wú)法用于精確定位。

到此這篇關(guān)于mysql左匹配規(guī)則的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)mysql左匹配規(guī)則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

白朗县| 通化市| 札达县| 西城区| 延边| 苏州市| 大安市| 丰台区| 富民县| 西林县| 山东省| 盘山县| 离岛区| 白朗县| 枣庄市| 荃湾区| 石门县| 望都县| 英德市| 绥滨县| 尼木县| 休宁县| 天峻县| 扬州市| 新平| 连州市| 河西区| 驻马店市| 唐山市| 云安县| 呼伦贝尔市| 云阳县| 文登市| 张家川| 绥宁县| 康保县| 凤山县| 抚顺市| 云阳县| 榆社县| 临颍县|