索引什麼時候不會生效,以下集中情況會導致索引失效:
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%’;
大家可以注意:
- handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數
- 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:在數據文件中讀下一行的請求數。如果你正進行大量的表掃描,該值較高。通常說明你的表索引不正確或寫入的查詢沒有利用索引。
編寫實屬不易,若喜歡或者對你有幫助記得點贊+關注或者收藏哦~