你好,面試官 | 我不僅知道MySQL索引,還會優(yōu)化呢~
小龍有話說
本期會模擬面試 MySQL 索引更深層 相關(guān)內(nèi)容。
涉及知識點(diǎn),MySQL 索引設(shè)計原則,使用法則,MySQL優(yōu)化等
本期題改編自 ——2021屆秋招 北森 二面
面試現(xiàn)場
叮叮叮......
面試官:“你好,我是XX面試官,請問是小龍嗎?”
小龍:“您好,面試官,我是小龍”
面試官:“好的,現(xiàn)在有空嗎,我們開始面試吧”
小龍:“嗯嗯,準(zhǔn)備好啦”
.......
other questions
.......
面試官:“我看你簡歷上有提到你對 MySQL 掌握得挺好的對吧?。”
小龍:“哈哈,還算可以吧!”
面試官:“好的,能告訴我 MySQL 中的怎樣創(chuàng)建索引嗎?”
小龍:“好的,我簡單說幾種?!?/p>
小龍:“一種是通過 alter 命令,ALTER TABLE table_name ADD INDEX index_name (column_list);”
小龍:“也可以在創(chuàng)建表時創(chuàng)建,CREATE INDEX index_name ON table_name (column_list);”
面試官:“好的,我們都知道索引用的好與壞,可以間接影響整個系統(tǒng)性能,那么你平時是怎樣去設(shè)計索引的呢?”
小龍:“其實(shí)道理很簡單,無須繁瑣花哨,在公司項(xiàng)目中,我們更看重的是性價比?!?/p>
獨(dú)白:“來了來了,幸好在我【面試筆記】中總結(jié)過,來吧,隨便挑幾點(diǎn)吹給你聽?!?/p>
面試官:“說說看~”
小龍:“總的來說,你創(chuàng)建索引目的就是要在盡可能少占內(nèi)存情況下去設(shè)計一個合適的索引讓查詢速度更快。”
面試官:“不錯,接著說”
小龍:“我們一般建在 where 字段匹配條件后,為了讓創(chuàng)建索引所帶來的好處大于其壞處,我們一定要在數(shù)據(jù)量大,也就是基數(shù)大的情況下才考慮索引?!?/p>
小龍:“因?yàn)閯?chuàng)建索引本身就要占空間,操作數(shù)據(jù)也要操作索引文件,數(shù)據(jù)少得不償失?!?/p>
面試官:“嗯嗯,不錯,還有嗎?”
小龍:“嗯,為了使得效率更高,應(yīng)該選擇區(qū)分度大,匹配度高的字段建立索引 。而且索引不適合于頻繁更新的數(shù)據(jù),因?yàn)椴僮鲾?shù)據(jù)同事需要維護(hù)索引又得花費(fèi)時間?!?/p>
面試官:“OK,那假如我本來已經(jīng)創(chuàng)建了個 (a) 索引,但是由于需求我們現(xiàn)在需要加上(b)索引,你覺得怎樣操作更好呢?”
小龍:“ 嗯,我覺得我們創(chuàng)建索引方面,我們應(yīng)該盡量擴(kuò)展索引,而不是創(chuàng)建新的索引,可以合理利用聯(lián)合索引,如(a)->(a,b) 。”
小龍:“除此之外,我們在使用時還得考慮索引是否會失效。不恰當(dāng)?shù)氖褂盟饕?,不僅沒有提高性能,反而占額外內(nèi)存空間,影響效率,所以說學(xué)會如何使用也是一門學(xué)問?!?/p>
面試官:“嗯嗯,那在使用時哪些地方需要我們注意呢?”
小龍:“這個在我【面試筆記】中詳細(xì)總結(jié)過啦,隨便給面試官舉幾個吧?!?/p>
小龍:“比如,我們在寫模糊查詢時,如果以 %開頭,索引會因此失效。”
面試官:“那你知道具體原因嗎?”
獨(dú)白:“牛逼,這個考得還算有水平”
小龍:“其實(shí),你理解了索引的構(gòu)造排列,你就懂了。”
小龍:”我們通常用的索引數(shù)據(jù)結(jié)構(gòu)是B+樹,而索引是有序排列的;索引的排列順序是根據(jù)比較字符串的首字母排序的,如果首字母相同,就根據(jù)比較第二個字母進(jìn)行排序,以此類推?!?/p>
小龍:”因此如果把 % 放在了前面,最左的 n 個字母便是模糊不定的,無法根據(jù)索引的有序性 準(zhǔn)確的定位到某一個索引,只能進(jìn)行全表掃描,找出符合條件的數(shù)據(jù)?!?/p>
面試官:“嗯嗯,好的,基礎(chǔ)不錯,那在項(xiàng)目中有嘗試去對MySQL進(jìn)行調(diào)優(yōu)優(yōu)化這些嗎?”
獨(dú)白:“幸好在我【面試筆記】中從 索引+sql語句+數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化+優(yōu)化器優(yōu)化+架構(gòu)優(yōu)化 詳細(xì)總結(jié)了?!?/p>
小龍:“ 優(yōu)化我們可以從很多方面考慮,比如 索引+sql語句+數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化+優(yōu)化器優(yōu)化+架構(gòu)優(yōu)化,這里簡單說幾個吧!”
面試官:“可以?!?/p>
小龍:“比如,我們從基本的索引考慮,盡量使用覆蓋索引,5.6了還支持索引下推呢!再寫多讀少的場景下,可以選擇普通索引而不要唯一索引,不懂可以看上一篇文章。”
小龍:“當(dāng)然需要考慮索引失效,和設(shè)計原則,上文說過了,不在贅述?!?/p>
小龍:“在寫 sql 時,若是主鍵自增的表,還可以把 Limit 查詢轉(zhuǎn)換成某個位置的查詢,比如 select * from tb_sku where id>20000 limit 10;這樣可以很好利用主鍵索引快速定位?!?/p>
小龍:“優(yōu)化器我們還可以使用 MRR 【Multi-Range Read】將 ID 或鍵值讀到 buffer 排序,通過把「隨機(jī)磁盤讀」,轉(zhuǎn)化為「順序磁盤讀」,減少磁盤IO,從而提高了索引查詢的性能。就暫時只說這些吧!”
面試官:“哈哈,好的,沒想到你還懂這些,不錯?!?/p>
小龍:“對啦,在使用過程中,我們首先應(yīng)該做到寫一手好 SQL ,考慮索引失效,復(fù)合查詢、事務(wù)、鎖等,其實(shí)把這些都注意,工作中大多數(shù)問題都已經(jīng)解決啦。”
小龍:“然后假如遇上了 SQL 執(zhí)行變慢,此時我們應(yīng)該先排查問題所在,如果可以直接找到問題可以直接解決。實(shí)在不行再考慮從優(yōu)化器參數(shù)、架構(gòu)、表設(shè)計等進(jìn)行優(yōu)化,這才是最好的優(yōu)化方案?!?/p>
面試官:“說的很好,看來平時還是有認(rèn)真學(xué)習(xí)參與項(xiàng)目中?!?/p>
面試官:“好的,時間差不多啦,今天暫時聊那么多,下期再談?wù)??!?/p>
獨(dú)白:“不愧是我,真男人是也!”
知識總結(jié)
本期我們通過面試模擬逐漸深入探討了 MySQL ,下期會繼續(xù)深入剖析關(guān)于 事務(wù)、鎖、日志等底層實(shí)現(xiàn)原理。訂閱+星標(biāo)持續(xù)追更
面試重點(diǎn)
索引設(shè)計原則?使用索引注意點(diǎn)?MySQL優(yōu)化方案等