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