MySQL中会使索引失效的几种情况
有表 test
;字段 id int(11) default null
,mark varchar(20) default null
;索引key_test_id
在id
上:
1.当查询条件带有is null
的时候:
可以看到使用了索引。
2.当查询条件是is not null
的时候:
可以看到没有使用索引。
从网上查一些资料得知,MySQL存储NULL值是需要空间的,NULL并不是什么都没有,因此在没有需要的情况下,字段最好设置为NOT NULL。具体可参考一下几篇文章:
MySQL字段属性应该尽量设置为NOT NULL
mysql 索引列为Null的走不走索引及null在统计时的问题
3.使用or
的时候,如果条件中的字段不是全部都带有索引,则不会使用索引:
可以看到,由于mark
字段上没有建立索引,所以id
上的索引也没有使用。假如在mark
上建立索引:
再次执行相同的语句:
可以看到到使用了索引。(这里sql语句有点语法错误,\G
后边不需要加;
)
关于上图Extra
字段有Using where
的提示,可以参考下文:
MYSQL EXPLAIN解析一 EXTRA中的USING INDEX,USING WHERE,USING INDEX CONDITION
上篇文章可能不太符合这个情景,但可以当作学习用。这种情况可以看这篇:
【MySQL】性能优化之 index merge (1)
4.有多列索引的时候,如果不使用多列索引的第一个字段,则不会使用索引。
有以下表结构:
进行以下查询:
可以看到并没有使用多列索引,因为i2
并不是多列索引的第一个字段。若进行下面的查询:
则可以看到使用了多列索引。
更多可以参考:
Mysql索引会失效的几种情况分析
详细例子后边再补充。