(轉(zhuǎn)載)聯(lián)合索引優(yōu)化多條件查詢

轉(zhuǎn)載自:聯(lián)合索引優(yōu)化多條件查詢


聯(lián)合索引是由多個字段組成的組合索引拴袭。若經(jīng)常需要使用多個字段的多條件查詢(WHERE col1 = … AND col2 = … AND col3 = …),可以考慮使用聯(lián)合索引。


現(xiàn)在數(shù)據(jù)表myIndex中i_testID是主鍵列谒养,其他列無任何索引:

這里寫圖片描述

多條件查找名字為xiaoming也物,城市為beijing逛漫,年齡為21的人:

這里寫圖片描述

返回了一行數(shù)據(jù)垛膝,從執(zhí)行計劃中看到,查詢沒有使用任何索引第股,進行了全表掃描应民,磁盤IO大。


為vc_Name建立索引:

這里寫圖片描述

進行同樣的查詢并查看執(zhí)行計劃:

這里寫圖片描述

返回了相同的結(jié)果夕吻,分析執(zhí)行計劃:SQL通過剛剛建立的index_of_name索引诲锹,不再進行全表掃描,而是先在索引中查找滿足節(jié)點值為xiaoming的節(jié)點(有5個)涉馅,再指向數(shù)據(jù)庫中相應的行归园,返回一個初步結(jié)果集后再由另外兩個條件進行一步步篩選得到最終結(jié)果。大大減少了磁盤IO稚矿,查詢效率也高于前者庸诱。


雖然在 vc_Name 上建立了索引捻浦,查詢時MYSQL不用掃描整張表,效率有所提高桥爽,但離我們的要求還有一定的距離朱灿。同樣的,在 vc_City 和 i_Age 分別建立的MySQL單列索引的效率相似钠四。為了進一步榨取 MySQL 的效率盗扒,就要考慮建立組合索引。


為多條件涉及的列建立聯(lián)合索引:

這里寫圖片描述

值得注意的是缀去,建立索引的時候應該根據(jù)需要規(guī)定索引長度侣灶,例如一個人的名字長度應該不會超過10個字符,通過vc_Name(10)規(guī)定索引長度后一定長度可以減少索引所占內(nèi)存缕碎。

現(xiàn)在表中的結(jié)構(gòu):

這里寫圖片描述

進行相同的查詢并查看執(zhí)行計劃:

這里寫圖片描述

返回相同的結(jié)果褥影,從執(zhí)行計劃可以看到:本次查詢使用了聯(lián)合索引name_city_age,在遍歷索引時就確定了只有一個節(jié)點滿足條件阎曹,直接指向數(shù)據(jù)庫表進行查詢(rows:1)伪阶。有更少的磁盤IO,所用時間更少处嫌!


使用聯(lián)合索引應該注意:

  1. MySQL使用聯(lián)合索引只能使用左側(cè)的部分,例如INDEX(a,b,c)斟湃,當條件為a或a,b或a,b,c時都可以使用索引熏迹,但是當條件為b,c時將不會使用索引。這好比一本先根據(jù)姓凝赛,再根據(jù)名進行排序的電話簿注暗,當查找的時候有姓的條件,效率會比沒有任何條件高墓猎;如果在姓的基礎上還有名的條件捆昏,效率會更高;但若只有名的條件毙沾,電話簿將不起作用骗卜。
  2. 離散度更高的索引應該放在聯(lián)合索引的前面,因為離散度高索引的可選擇性高左胞】懿郑考慮一種極端的情況,數(shù)據(jù)表中有100條記錄烤宙,若INDEX(a,b)中a只有兩種情況遍烦,而b有100種情況。這樣對于查詢唯一記錄a = …躺枕,b = …時服猪,先遍歷全部索引看滿足a條件的有50個索引節(jié)點供填,接下來還要再一個個遍歷這50個索引節(jié)點。如果是INDEX(b,a)罢猪,先遍歷全部索引發(fā)現(xiàn)滿足b條件的索引節(jié)點只有一個捕虽,再遍歷這個節(jié)點發(fā)現(xiàn)也滿足a條件。雖然最后都能找到那個唯一的索引節(jié)點坡脐,但是第二種索引順序?qū)σ姹闅v索引效率有很大的提高(用電話薄的思想去思考問題)泄私。
  3. 查看列的離散程度:
這里寫圖片描述

customer_id列的離散程度更高,建聯(lián)合索引時應該INDEX(customer_id,staff_id);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末备闲,一起剝皮案震驚了整個濱河市晌端,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恬砂,老刑警劉巖咧纠,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泻骤,居然都是意外死亡漆羔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門狱掂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來演痒,“玉大人,你說我怎么就攤上這事趋惨∧袼常” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵器虾,是天一觀的道長讯嫂。 經(jīng)常有香客問我,道長兆沙,這世上最難降的妖魔是什么欧芽? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮葛圃,結(jié)果婚禮上千扔,老公的妹妹穿的比我還像新娘。我一直安慰自己装悲,他們只是感情好昏鹃,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诀诊,像睡著了一般洞渤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上属瓣,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天载迄,我揣著相機與錄音讯柔,去河邊找鬼。 笑死护昧,一個胖子當著我的面吹牛魂迄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惋耙,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捣炬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绽榛?” 一聲冷哼從身側(cè)響起湿酸,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灭美,沒想到半個月后推溃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡届腐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年铁坎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犁苏。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡硬萍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傀顾,到底是詐尸還是另有隱情襟铭,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布短曾,位于F島的核電站,受9級特大地震影響赐劣,放射性物質(zhì)發(fā)生泄漏嫉拐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一魁兼、第九天 我趴在偏房一處隱蔽的房頂上張望婉徘。 院中可真熱鬧,春花似錦咐汞、人聲如沸盖呼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽几晤。三九已至,卻和暖如春植阴,著一層夾襖步出監(jiān)牢的瞬間蟹瘾,已是汗流浹背圾浅。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憾朴,地道東北人狸捕。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像众雷,于是被迫代替她去往敵國和親灸拍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容