看到网上有一些人说: MySql中如果某一列中含有NULL,那么包含该列的索引就无效了。
给one 和two 字段分别加上普通索引。之前有写过,在复习添加索引:Mysql索引整理总结
-- ALTER TABLE table_name ADD INDEX index_name(col_name);
ALTER TABLE tb_test ADD INDEX index_oat (one, two);
ALTER TABLE tb_test add INDEX index_two(two);
1
2
3
使用 show keys from 表名;或show indexes from 表名; ,查看这个表的所有索引信息。
一个普通索引,一个复合索引。
复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。
可以看到,创建了两个索引,并且index_tow NULL 那一列是 YES。
使用EXPLAIN 来进行演示说明,EXPLAIN 的使用说明:Mysql中explain用法和结果字段的含义介绍
复合索引
普通索引
发现查询two字段 是可以正常使用索引的。我使用的MYSQL 5.7 ,InnoDB 引擎。也看了一些网上的资料,MySQL中NULL对索引的影响 这个文章中用例子验证,MySQL可以在含有null的列上使用索引。
备注:可能是其他条件下不行,看网上资料说使用空间索引会失效,具体我没有去验证,空间索引没有用到过。查询官网create-index-spatial,感兴趣的伙伴可以自行验证。
这里我想到一点,很多问题的答案都是在指定的条件和环境下才成立,多质疑,多验证。
小总结 :在有NULL值得字段上使用常用的索引,如普通索引、复合索引、全文索引等不会使索引失效。在官网查看在空间索引的情况下,说明了 索引列必须为NOT NULL。