网上很多的说法,都是说不能走索引。但其实是错误的。
其实也是又可能走索引的。
比如,select * from table where a = xxx or a is null;
通过explain 看这条sql的执行计划,type = ref_or_null,这条sql语句会查询两次,第一次按照查询 a = xxx,第二次再单独查询 a is null
为了更好的利用索引,索引列字段要设置为 NOT NULL 约束。有两个原因:
● 第一原因:索引列存在 NULL 就会导致优化器在做索引选择的时候更加复杂,更加难以优化,因为可为 NULL 的列会使索引、索引统计和值比较都更复杂,比如进行索引统计时,count 会省略值为NULL 的行。
● 第二个原因:NULL 值是一个没意义的值,但是它会占用物理空间,所以会带来的存储空间的问题,因为 InnoDB 存储记录的时候,如果表中存在允许为 NULL 的字段,那么行格式(opens new window)中至少会用 1 字节空间存储 NULL 值列表,如下图的紫色部分:
●