1. 程式人生 > >Mysql的索引以及使用索引可能失效的場景

Mysql的索引以及使用索引可能失效的場景

我們先來回顧下mysql的索引:

普通索引:最基本的索引,沒有任何限制
唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引:它 是一種特殊的唯一索引,不允許有空值。 
全文索引:僅可用於 MyISAM 表,針對較大的資料,生成全文索引很耗時好空間。
組合索引:為了更多的提高mysql效率可建立組合索引,遵循”最左字首“原則。建立複合索引時應該將最常用(頻率)作限制條件的列放在最左邊,依次遞減。

失效的場景:

1.WHERE字句的查詢條件裡有不等於號(WHERE column!=…),MYSQL將無法使用索引
2.類似地,如果WHERE字句的查詢條件裡使用了函式(如:WHERE DAY(column)=…),MySQL將無法使用索引


3.在JOIN操作中(需要從多個數據表提取資料時),mysql只有在主鍵和外來鍵的資料型別相同時才能使用索引,否則即使建立了索引也不會使用


4.如果WHERE子句的查詢條件裡使用了比較操作符LIKE和REGEXP,MYSQL只有在搜尋模板的第一個字元不是萬用字元的情況下才能使用索引。比如說,如果查詢條件是LIKE 'abc%',MYSQL將使用索引;如果條件是LIKE '%abc',MYSQL將不使用索引。


5.在ORDER BY操作中,MYSQL只有在排序條件不是一個查詢條件表示式的情況下才使用索引。儘管如此,在涉及多個數據表的查詢裡,即使有索引可用,那些索引在加快ORDER BY操作方面也沒什麼作用。


6.如果某個資料列裡包含著許多重複的值,就算為它建立了索引也不會有很好的效果。比如說,如果某個資料列裡包含了淨是些諸如“0/1”或“Y/N”等值,就沒有必要為它建立一個索引。


7.索引有用的情況下就太多了。基本只要建立了索引,除了上面提到的索引不會使用的情況下之外,其他情況只要是使用在WHERE條件裡,ORDER BY 欄位,聯表字段,一般都是有效的。 建立索引要的就是有效果。 不然還用它幹嗎? 如果不能確定在某個欄位上建立的索引是否有效果,只要實際進行測試下比較下執行時間就知道。


8.如果條件中有or(並且其中有or的條件是不帶索引的),即使其中有條件帶索引也不會使用(這也是為什麼儘量少用or的原因)。注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引


9.如果列型別是字串,那一定要在條件中將資料使用引號引用起來,否則不使用索引


10.如果mysql估計使用全表掃描要比使用索引快,則不使用索引