“索引什麼時候失效?” 面試過程中,突如其來的一個問題,是不是有點懵? 沒關係,關註我,面試不迷路。 我是Mic,一個工作了14年的Java程式員。 索引失效涉及到的知識點非常多,所以我把這個問題的回答整理到了一個20W字的面試文檔裡面,大家可以領取。 下麵看看高手的回答 高手: InnoDB引擎里 ...
“索引什麼時候失效?”
面試過程中,突如其來的一個問題,是不是有點懵?
沒關係,關註我,面試不迷路。
我是Mic,一個工作了14年的Java程式員。
索引失效涉及到的知識點非常多,所以我把這個問題的回答整理到了一個20W字的面試文檔裡面,大家可以領取。
下麵看看高手的回答
高手:
InnoDB引擎裡面有兩種索引類型,一種是主鍵索引、一種是普通索引。
InnoDB用了B+樹的結構來存儲索引數據。
當使用索引列進行數據查詢的時候,最終會到主鍵索引樹中查詢對應的數據行進行返回。
理論上來說,使用索引列查詢,就能很好的提升查詢效率,但是不規範的使用會導致索引失效,從而無法發揮索引本身的價值。
導致索引失效的情況有很多:
-
在索引列上做運算,比如使用函數,Mysql在生成執行計劃的時候,它是根據統計信息來判斷是否要使用索引的。
而在索引列上加函數運算,導致Mysql無法識別索引列,也就不會再走索引了。
不過從Mysql8開始,增加了函數索引可以解決這個問題。
-
在一個由多列構成的組合索引中,需要按照最左匹配法則,也就是從索引的最左列開始順序檢索,否則不會走索引。
在組合索引中,索引的存儲結構是按照索引列的順序來存儲的,因此在sql中也需要按照這個順序才能進行逐一匹配。
否則InnoDB無法識別索引導致索引失效。
-
當索引列存在隱式轉化的時候, 比如索引列是字元串類型,但是在sql查詢中沒有使用引號。
那麼Mysql會自動進行類型轉化,從而導致索引失效。
-
在索引列使用不等於號、
not
查詢的時候,由於索引數據的檢索效率非常低,因此Mysql引擎會判斷不走索引。 -
使用like通配符匹配尾碼
%xxx
的時候,由於這種方式不符合索引的最左匹配原則,所以也不會走索引。但是反過來,如果通配符匹配的是首碼
xxx%
,符合最左匹配,也會走索引。 -
使用
or
連接查詢的時候,or
語句前後沒有同時使用索引,那麼索引會失效。只有or
左右查詢欄位都是索引列的時候,才會生效。
除了這些場景以外,對於多表連接查詢的場景中,連接順序也會影響索引的使用。
不過最終是否走索引,我們可以使用explain命令來查看sql的執行計劃,然後針對性的進行調優即可。
總結
Mysql裡面很多問題都可以考察畢竟它也是工作中使用非常頻繁的組件,按道理來說,我們是有必要去深度學習Mysql的底層原理。
畢竟數據的安全性、數據IO性能都會影響到系統的整體吞吐量。
大家記得點贊、收藏加關註。
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自
Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!