哪些情況下sql的索引會失效呢

索引什麼時候不會生效,以下集中情況會導致索引失效:

1.條件中用or,那麼就算其中條件帶索引,也不會使用索引查詢

這裏就要注意查詢時儘量用in,避免用or

關於explain 請見本博另一篇博文:https://blog.csdn.net/yxd504/article/details/106080546

此處我們在將realname設爲索引,此處需要索引生效表內數據必須大於等於三條

看到key,索引生效,先使用主鍵索引,在使用索引,按照順序。

Type :index_merge  表明使用了合併索引

Extra :Using union(PRIMARY,t_userid);  表明合併爲index_merge 索引使用了 union 算法

2.對於多列索引,不是使用的第一部分,則不會使用索引。

其中有一個條件不是索引則將會全表查詢。

3.like的模糊查詢以%開頭,索引失效;以%結尾,索引生效;

4.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不會使用索引

5.如果MySQL預計使用全表掃描要比使用索引快,則不使用索引

下面是查看索引使用情況:

show status like ‘Handler_read%’;  

大家可以注意:  

  1. handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數  
  2. handler_read_rnd_next:這個值越高,說明查詢低效 

以下是度娘查找,瞭解瞭解,記不住。。。

分析這幾個值,我們可以查看當前索引的使用情況:

Handler_read_first:索引中第一條被讀的次數。如果較高,它表示服務器正執行大量全索引掃描;例如,SELECT col1 FROM foo,假定col1有索引(這個值越低越好)。

Handler_read_key:如果索引正在工作,這個值代表一個行被索引值讀的次數,如果值越低,表示索引得到的性能改善不高,因爲索引不經常使用(這個值越高越好)。

Handler_read_next :按照鍵順序讀下一行的請求數。如果你用範圍約束或如果執行索引掃描來查詢索引列,該值增加。

Handler_read_prev:按照鍵順序讀前一行的請求數。該讀方法主要用於優化ORDER BY ... DESC。

Handler_read_rnd :根據固定位置讀一行的請求數。如果你正執行大量查詢並需要對結果進行排序該值較高。你可能使用了大量需要MySQL掃描整個表的查詢或你的連接沒有正確使用鍵。這個值較高,意味着運行效率低,應該建立索引來補救。

Handler_read_rnd_next:在數據文件中讀下一行的請求數。如果你正進行大量的表掃描,該值較高。通常說明你的表索引不正確或寫入的查詢沒有利用索引。

編寫實屬不易,若喜歡或者對你有幫助記得點贊+關注或者收藏哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章