天天看點

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

Mysql 索引的使用 如何避免索引失效

文章目錄

  • Mysql 索引的使用 如何避免索引失效
    • 1, 全值比對
    • 2,最左字首法則
    • 3,範圍查詢,右邊的列,不能使用索引
    • 4,在某一列上使用了運算操作,索引将失效
    • 5,字元串不加單引号,造成索引失效
    • 6,盡量使用覆寫索引,避免select *
    • 7,用or分割的條件
    • 8,以%開頭的like模糊查詢,索引失效
    • 9,如果MySQL評估使用索引比全表掃描更慢,則不使用索引
    • 10,is NULL和is NOT NULL ==有時==索引失效

1, 全值比對

對索引中所有列都指定具體值,這時,索引生效,執行效率高

2,最左字首法則

如果建立了複合索引,要遵守最左字首法則。指的是查詢要從索引的最左前列開始,索引的列可以不全用,但是不能跳過索引中的列

下面是示例

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

可以看見三種情況下,索引都生效

但是,如果沒有第一列的name字段,是不會使用索引的

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

注意:這裡的最左字首,指的是查詢條件是否包含,而與where後的字段順序無關,下面這張圖作為驗證

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

如果where後的條件包含的字段不是連續的,則使用複合索引中連續的從左邊開始的部分索引

如下圖,索引是(name,status,address),跳過了status字段,包含address,但explain分析後,查詢時隻使用了name索引

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

3,範圍查詢,右邊的列,不能使用索引

如下圖所示,第一次索引長度為813,使用name、status和address複合索引

第二次,使用範圍查詢,索引右邊的address字段将不算在索引範圍内,隻使用name索引,長度410

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

4,在某一列上使用了運算操作,索引将失效

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

5,字元串不加單引号,造成索引失效

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

6,盡量使用覆寫索引,避免select *

盡量使用覆寫索引(隻通路索引的查詢(索引列完全包含查詢列)),減少select *

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效
Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

可以看見第一次select的部分字段不在索引内,是以最終需要回表查詢

關鍵詞 含義
using index 使用覆寫索引的時候會出現
using where 在查找使用索引的情況下,需要回表去查詢所需的資料
using index condition 查找使用了索引,但是需要回表查詢資料
using index 查找使用了索引,但是需要的資料都在索引列中能找到,是以不需要回表查詢資料

7,用or分割的條件

如果or前面的條件用了索引,or後面的條件沒有使用索引,整個查詢将不會使用索引

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

可以看見,使用or時,索引失效,改為and連接配接,則會使用索引

8,以%開頭的like模糊查詢,索引失效

如果是尾部模糊查詢,索引不會失效,如果是頭部模糊比對,索引失效

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

但是%XXX%形式的模糊查詢又非常實用

解決方案:

實用覆寫索引:将select * 改為 select sellerid,name,status,address 等建立了索引的字段

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

由圖可知,使用覆寫索引後,%XXX%形式的模糊查詢又會使用索引了

9,如果MySQL評估使用索引比全表掃描更慢,則不使用索引

Mysql 索引的使用 如何避免索引失效Mysql 索引的使用 如何避免索引失效

第一句是建立索引,後面兩次查詢可知,特殊情況下(查詢字段占比特别大),MySQL查詢将不使用索引

10,is NULL和is NOT NULL 有時索引失效