一次mysql聯(lián)合索引的面試題

mysql聯(lián)合索引是經(jīng)常被碰到的問題,上周面試了一個牛逼的國際旅游公司就被問到了,之前覺得好理解,沒想到追問之下也是破綻百出,我還原下當(dāng)時的場景。

說說mysql的聯(lián)合索引,如果a b c建立聯(lián)合索引,搜ac和bc會用到嗎?
:不會,聯(lián)合索引本質(zhì)是建立a,ab abc 3個索引,遵循最左匹配原則,這個過了。

聯(lián)合索引的好處?
我舉了個排序的例子,如果搜索ab,聯(lián)合索引按ab排序,所以可以省掉排序的操作,提供性能
我想這個也能過,結(jié)果面試官追問。。

如果不考慮排序,有2個單獨的索引a和b,查兩次不是一樣么,會慢嗎?
我這里被挖坑了,正確答案是mysq分析器一次只會選一個索引,不會選兩個,所以這種場景搜索兩個字段用聯(lián)合索引肯定比單個所以快。

后來查了資料,mysql新版本也支持索引合并,也就是可以同時查2個單獨的索引a和b,這里我們比較下和聯(lián)合索引查找的區(qū)別:
兩個單獨的索引a和b,假設(shè)要找a=100,b=200的數(shù)據(jù),索引a只能找出a=100的記錄,可能里面有大部分b不是200,那么還是會讀取過多的記錄,然后利用b索引的結(jié)果取過濾。

聯(lián)合索引a和b都已經(jīng)在索引樹了,所以匹配直接在索引上就可以完成,最終只會去讀復(fù)合條件的記錄,減小了io時間。

這篇文章的一句描述不錯,可以幫你理解聚合索引的本質(zhì)(https://www.cnblogs.com/leader007/p/10524265.html)

利用索引中的附加列,您可以縮小搜索的范圍,但使用一個具有兩列的索引 不同于使用兩個單獨的索引。復(fù)合索引的結(jié)構(gòu)與電話簿類似,人名由姓和名構(gòu)成,電話簿首先按姓氏對進行排序,然后按名字對有相同姓氏的人進行排序。如果您知 道姓,電話簿將非常有用;如果您知道姓和名,電話簿則更為有用,但如果您只知道名不姓,電話簿將沒有用處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容