Mysql 索引的使用 如何避免索引失效
文章目錄
- Mysql 索引的使用 如何避免索引失效
-
- 1, 全值比對
- 2,最左字首法則
- 3,範圍查詢,右邊的列,不能使用索引
- 4,在某一列上使用了運算操作,索引将失效
- 5,字元串不加單引号,造成索引失效
- 6,盡量使用覆寫索引,避免select *
- 7,用or分割的條件
- 8,以%開頭的like模糊查詢,索引失效
- 9,如果MySQL評估使用索引比全表掃描更慢,則不使用索引
- 10,is NULL和is NOT NULL ==有時==索引失效
1, 全值比對
對索引中所有列都指定具體值,這時,索引生效,執行效率高
2,最左字首法則
如果建立了複合索引,要遵守最左字首法則。指的是查詢要從索引的最左前列開始,索引的列可以不全用,但是不能跳過索引中的列
下面是示例
可以看見三種情況下,索引都生效
但是,如果沒有第一列的name字段,是不會使用索引的
注意:這裡的最左字首,指的是查詢條件是否包含,而與where後的字段順序無關,下面這張圖作為驗證
如果where後的條件包含的字段不是連續的,則使用複合索引中連續的從左邊開始的部分索引
如下圖,索引是(name,status,address),跳過了status字段,包含address,但explain分析後,查詢時隻使用了name索引
3,範圍查詢,右邊的列,不能使用索引
如下圖所示,第一次索引長度為813,使用name、status和address複合索引
第二次,使用範圍查詢,索引右邊的address字段将不算在索引範圍内,隻使用name索引,長度410
4,在某一列上使用了運算操作,索引将失效
5,字元串不加單引号,造成索引失效
6,盡量使用覆寫索引,避免select *
盡量使用覆寫索引(隻通路索引的查詢(索引列完全包含查詢列)),減少select *
可以看見第一次select的部分字段不在索引内,是以最終需要回表查詢
關鍵詞 | 含義 |
---|---|
using index | 使用覆寫索引的時候會出現 |
using where | 在查找使用索引的情況下,需要回表去查詢所需的資料 |
using index condition | 查找使用了索引,但是需要回表查詢資料 |
using index | 查找使用了索引,但是需要的資料都在索引列中能找到,是以不需要回表查詢資料 |
7,用or分割的條件
如果or前面的條件用了索引,or後面的條件沒有使用索引,整個查詢将不會使用索引
可以看見,使用or時,索引失效,改為and連接配接,則會使用索引
8,以%開頭的like模糊查詢,索引失效
如果是尾部模糊查詢,索引不會失效,如果是頭部模糊比對,索引失效
但是%XXX%形式的模糊查詢又非常實用
解決方案:
實用覆寫索引:将select * 改為 select sellerid,name,status,address 等建立了索引的字段
由圖可知,使用覆寫索引後,%XXX%形式的模糊查詢又會使用索引了
9,如果MySQL評估使用索引比全表掃描更慢,則不使用索引
第一句是建立索引,後面兩次查詢可知,特殊情況下(查詢字段占比特别大),MySQL查詢将不使用索引