【Java面試】這道互聯網高頻面試題難住了80%的程式設計師?索引什麼時候失效?

「索引什麼時候失效?」

面試過程中,突如其來的一個問題,是不是有點懵?

沒關係,關注我,面試不迷路。

我是Mic,一個工作了14年的Java程式設計師。

索引失效涉及到的知識點非常多,所以我把這個問題的回答整理到了一個20W字的面試文檔裡面,大家可以領取。

下面看看高手的回答

高手:

InnoDB引擎裡面有兩種索引類型,一種是主鍵索引、一種是普通索引。

InnoDB用了B+樹的結構來存儲索引數據。

當使用索引列進行數據查詢的時候,最終會到主鍵索引樹中查詢對應的數據行進行返回。

理論上來說,使用索引列查詢,就能很好的提升查詢效率,但是不規範的使用會導致索引失效,從而無法發揮索引本身的價值。

導致索引失效的情況有很多:

  1. 在索引列上做運算,比如使用函數,Mysql在生成執行計劃的時候,它是根據統計資訊來判斷是否要使用索引的。

    而在索引列上加函數運算,導致Mysql無法識別索引列,也就不會再走索引了。

    不過從Mysql8開始,增加了函數索引可以解決這個問題。

  2. 在一個由多列構成的組合索引中,需要按照最左匹配法則,也就是從索引的最左列開始順序檢索,否則不會走索引。

    在組合索引中,索引的存儲結構是按照索引列的順序來存儲的,因此在sql中也需要按照這個順序才能進行逐一匹配。

    否則InnoDB無法識別索引導致索引失效。

  3. 當索引列存在隱式轉化的時候, 比如索引列是字元串類型,但是在sql查詢中沒有使用引號。

    那麼Mysql會自動進行類型轉化,從而導致索引失效。

  4. 在索引列使用不等於號、not查詢的時候,由於索引數據的檢索效率非常低,因此Mysql引擎會判斷不走索引。

  5. 使用like通配符匹配後綴%xxx的時候,由於這種方式不符合索引的最左匹配原則,所以也不會走索引。

    但是反過來,如果通配符匹配的是前綴xxx%,符合最左匹配,也會走索引。

  6. 使用or連接查詢的時候,or語句前後沒有同時使用索引,那麼索引會失效。只有or左右查詢欄位都是索引列的時候,才會生效。

除了這些場景以外,對於多表連接查詢的場景中,連接順序也會影響索引的使用。

不過最終是否走索引,我們可以使用explain命令來查看sql的執行計劃,然後針對性的進行調優即可。

總結

Mysql裡面很多問題都可以考察畢竟它也是工作中使用非常頻繁的組件,按道理來說,我們是有必要去深度學習Mysql的底層原理。

畢竟數據的安全性、數據IO性能都會影響到系統的整體吞吐量。

大家記得點贊、收藏加關注。

file

版權聲明:本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!

Tags: