mysql索引最左匹配原則的理解

這是你的表結構抛人,有三個字段,分別是id,name,cid

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `cid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name_cid_INX` (`name`,`cid`),
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8

索引方面:id是主鍵脐瑰,(name,cid)是一個多列索引妖枚。

下面是你有疑問的兩個查詢:

EXPLAIN SELECT * FROM student WHERE cid=1;

注意下面的index索引

image
EXPLAIN SELECT * FROM student WHERE  cid=1 AND name='小紅';

注意下面的ref索引

image

這里的疑問是:sql查詢用到索引的條件是必須要遵守最左前綴原則,為什么上面兩個查詢還能用到索引苍在?

上述你的兩個查詢的explain結果中顯示用到索引的情況類型是不一樣的绝页。,可觀察explain結果中的type字段荠商。你的查詢中分別是:
1. type: index
2. type: ref

解釋:
index:這種類型表示是mysql會對整個該索引進行掃描。要想用到這種類型的索引续誉,對這個索引并無特別要求莱没,只要是索引,或者某個復合索引的一部分酷鸦,mysql都可能會采用index類型的方式掃描饰躲。但是呢,缺點是效率不高臼隔,mysql會從索引中的第一個數據一個個的查找到最后一個數據嘹裂,直到找到符合判斷條件的某個索引。
(掃描索引在一定程度上也比掃描全表要快)

所以:對于你的第一條語句:

EXPLAIN SELECT * FROM student WHERE   cid=1;

判斷條件是cid=1,而cid是(name,cid)復合索引的一部分摔握,沒有問題寄狼,可以進行index類型的索引掃描方式。explain顯示結果使用到了索引氨淌,是index類型的方式泊愧。


ref:這種類型表示mysql會根據特定的算法快速查找到某個符合條件的索引,而不是會對索引中每一個數據都進行一一的掃描判斷盛正,也就是所謂你平常理解的使用索引查詢會更快的取出數據删咱。而要想實現(xiàn)這種查找,索引卻是有要求的豪筝,要實現(xiàn)這種能快速查找的算法痰滋,索引就要滿足特定的數據結構。
簡單說壤蚜,也就是索引字段的數據必須是有序的即寡,才能實現(xiàn)這種類型的查找,才能利用到索引袜刷。

有些了解的人可能會問聪富,索引不都是一個有序排列的數據結構么。不過答案說的還不夠完善著蟹,那只是針對單個索引墩蔓,而復合索引的情況有些同學可能就不太了解了。

下面就說下復合索引:
以該表的(name,cid)復合索引為例,它內部結構簡單說就是下面這樣排列的:

image

mysql創(chuàng)建復合索引的規(guī)則是首先會對復合索引的最左邊的萧豆,也就是第一個name字段的數據進行排序奸披,在第一個字段的排序基礎上,然后再對后面第二個的cid字段進行排序涮雷。其實就相當于實現(xiàn)了類似 order by name asc, cid asc這樣一種排序規(guī)則阵面。

所以:第一個name字段是絕對有序的,而第二字段就是無序的了。所以通常情況下样刷,直接使用第二個cid字段進行條件判斷是用不到索引的仑扑,當然,可能會出現(xiàn)上面的使用index類型的索引置鼻。這就是所謂的mysql為什么要強調最左前綴原則的原因镇饮。

那么什么時候才能用到呢?
當然是cid字段的索引數據也是有序的情況下才能使用咯,什么時候才是有序的呢箕母?觀察可知储藐,當然是在name字段是等值匹配的情況下,cid才是有序的嘶是。發(fā)現(xiàn)沒有钙勃,觀察兩個name名字為 c 的cid字段是不是有序的呢。從上往下分別是4 5俊啼。
這也就是mysql索引規(guī)則中要求復合索引要想使用第二個索引肺缕,必須先使用第一個索引的原因左医。(而且第一個索引必須是等值匹配)授帕。


所以對于你的這條sql查詢:

EXPLAIN SELECT * FROM student WHERE   cid=1 AND name='小紅';

沒有錯,而且復合索引中的兩個索引字段都能很好的利用到了浮梢!因為語句中最左面的name字段進行了等值匹配跛十,所以cid是有序的,也可以利用到索引了秕硝。

你可能會問:我建的索引是(name,cid)芥映。而我查詢的語句是cid=1 AND name='小紅'; 我是先查詢cid,再查詢name的远豺,不是先從最左面查的呀奈偏?

好吧,我再解釋一下這個問題:首先可以肯定的是把條件判斷反過來變成這樣 name='小紅' and cid=1; 最后所查詢的結果是一樣的躯护。
那么問題產生了惊来?既然結果是一樣的,到底以何種順序的查詢方式最好呢棺滞?

所以裁蚁,而此時那就是我們的mysql查詢優(yōu)化器該登場了,mysql查詢優(yōu)化器會判斷糾正這條sql語句該以什么樣的順序執(zhí)行效率最高继准,最后才生成真正的執(zhí)行計劃枉证。所以,當然是我們能盡量的利用到索引時的查詢順序效率最高咯移必,所以mysql查詢優(yōu)化器會最終以這種順序進行查詢執(zhí)行室谚。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秒赤,更是在濱河造成了極大的恐慌眨补,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倒脓,死亡現(xiàn)場離奇詭異撑螺,居然都是意外死亡,警方通過查閱死者的電腦和手機崎弃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門甘晤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饲做,你說我怎么就攤上這事线婚。” “怎么了盆均?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵塞弊,是天一觀的道長。 經常有香客問我泪姨,道長游沿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任肮砾,我火速辦了婚禮诀黍,結果婚禮上,老公的妹妹穿的比我還像新娘仗处。我一直安慰自己眯勾,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布婆誓。 她就那樣靜靜地躺著吃环,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洋幻。 梳的紋絲不亂的頭發(fā)上郁轻,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音鞋屈,去河邊找鬼范咨。 笑死,一個胖子當著我的面吹牛厂庇,可吹牛的內容都是我干的渠啊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼权旷,長吁一口氣:“原來是場噩夢啊……” “哼替蛉!你這毒婦竟也來了贯溅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤躲查,失蹤者是張志新(化名)和其女友劉穎它浅,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體镣煮,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡姐霍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了典唇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镊折。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖介衔,靈堂內的尸體忽然破棺而出恨胚,到底是詐尸還是另有隱情,我是刑警寧澤炎咖,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布赃泡,位于F島的核電站,受9級特大地震影響乘盼,放射性物質發(fā)生泄漏升熊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一蹦肴、第九天 我趴在偏房一處隱蔽的房頂上張望僚碎。 院中可真熱鬧猴娩,春花似錦阴幌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蟆豫,卻和暖如春议忽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背十减。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工栈幸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帮辟。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓速址,卻偏偏與公主長得像,于是被迫代替她去往敵國和親由驹。 傳聞我的和親對象是個殘疾皇子芍锚,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容