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

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

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

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

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

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

簡單來說,左匹配規(guī)則指的是:

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

換句話說,你不能跳過左邊的列直接使用右邊的列,也不能只使用中間或右邊的列。就像爬樓梯,你必須從第一級開始,一階一階往上,不能直接跳到第三級。

為什么會有這個規(guī)則?——B+樹的秘密

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

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

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

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

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

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

索引列順序:nameagecity

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

1. 完全使用最左邊一列

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

?? 索引從 name 開始,完美命中。

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

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

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

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

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

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

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

1. 未從最左邊開始

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. 范圍之后全失效
    索引列上的范圍查詢會讓其后的索引列無法用于精確定位。

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

相關(guān)文章

最新評論

清徐县| 怀安县| 建湖县| 莱芜市| 汉源县| 滦平县| 浙江省| 汝城县| 武冈市| 陕西省| 新建县| 湘乡市| 湄潭县| 筠连县| 延津县| 翁源县| 韶山市| 壤塘县| 射阳县| 亳州市| 博野县| 雅江县| 青川县| 新邵县| 崇明县| 岗巴县| 临夏市| 托克逊县| 鸡泽县| 方山县| 阿坝县| 临清市| 疏勒县| 苍山县| 固阳县| 嘉黎县| 孝昌县| 海兴县| 茶陵县| 景谷| 盘锦市|