“索引什么時候失效?”
面試程序中,突如其來的一個問題,是不是有點懵?
沒關系,關注我,面試不迷路,
我是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學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501150.html
標籤:Java
下一篇:Javaweb05-Ajax
