#Mysql有效索引和無效索引的介紹 標籤: Mysql 索引mysql
內容轉自前往sql
##1.索引可能失效的場景函數
1.WHERE字句的查詢條件裏有不等於號(WHERE column!=...),MYSQL將沒法使用索引測試
2.相似地,若是WHERE字句的查詢條件裏使用了函數(如:WHERE DAY(column)=...),MYSQL將沒法使用索引.net
3.在JOIN操做中(須要從多個數據表提取數據時),MYSQL只有在主鍵和外鍵的數據類型相同時才能使用索引,不然即便創建了索引也不會使用code
4.若是WHERE子句的查詢條件裏使用了比較操做符LIKE和REGEXP,MYSQL只有在搜索模板的第一個字符不是通配符的狀況下才能使用索引。好比說,若是查詢條件是LIKE 'abc%',MYSQL將使用索引;若是條件是LIKE '%abc',MYSQL將不使用索引。htm
5.在ORDER BY操做中,MYSQL只有在排序條件不是一個查詢條件表達式的狀況下才使用索引。儘管如此,在涉及多個數據表的查詢裏,即便有索引可用,那些索引在加快ORDER BY操做方面也沒什麼做用。排序
6.若是某個數據列裏包含着許多重複的值,就算爲它創建了索引也不會有很好的效果。好比說,若是某個數據列裏包含了淨是些諸如「0/1」或「Y/N」等值,就沒有必要爲它建立一個索引。索引
7.索引有用的狀況下就太多了。基本只要創建了索引,除了上面提到的索引不會使用的狀況下以外,其餘狀況只要是使用在WHERE條件裏,ORDER BY 字段,聯表字段,通常都是有效的。 創建索引要的就是有效果。 否則還用它幹嘛? 若是不能肯定在某個字段上創建的索引是否有效果,只要實際進行測試下比較下執行時間就知道。字符串
8.若是條件中有or(而且其中有or的條件是不帶索引的),即便其中有條件帶索引也不會使用(這也是爲何儘可能少用or的緣由)。注意:要想使用or,又想讓索引生效,只能將or條件中的每一個列都加上索引
9.若是列類型是字符串,那必定要在條件中將數據使用引號引用起來,不然不使用索引
10.若是mysql估計使用全表掃描要比使用索引快,則不使用索引
##2.mysql查看全部的命令集
show status like 'Handler_read%'; 注意:handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數 handler_read_rnd_next:這個值越高,說明查詢低效