MySQL中会使索引失效的几种情况

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