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