很多博客说mysql在字段中创建普通索引,如果该索引中的数据存在null值是不走索引这个结论是错误的,不过尽量还是设置默认值。(版本8.0低于这个版本可能结果不一致) 1、创建表s
很多博客说mysql在字段中创建普通索引,如果该索引中的数据存在null值是不走索引这个结论是错误的,不过尽量还是设置默认值。(版本8.0低于这个版本可能结果不一致) 1、创建表sc_base_color,其中普通索引为 “name,group_num”,这里暂时不测组合索引,下面再测试。
2、初始化测试数据
3、测试普通索引为NULL的情况是否使用了索引 使用 = 查询,测试结果中使用到了索引,其中索引字段的值为“NULL”
截图结果,两列数据都存在空,最终走了索引。 使用 大于、小于 查询
截图结果 使用 不等于、not in 、isnull、!isnull查询
截图结果 使用isnull、is not null查询
由此可以得出结论,字段为空是可以走索引的,但是部分场景可能会失效,尽量还是给默认值。 4、测试组合索引为NULL是否走了索引 先删除普通索引字段,增加组合索引
测试 = > < 查询结果
截图结果,是可以走索引的,下面的逻辑就不用测试了和普通索引一样,除非不符合最左匹配原则直接查询name字段。 5、总结 在设计数据库的时候尽量还是给字段的默认值。 1、比如int、bigint类型默认值为-1/0 2、比如varchar类型默认值为空串 3、bigdecimal类型为0等等。 NULL值会有不少坑 1、count(字段NULL)会过滤统计的数据,sum这些函数也会 2、使用> < 的时候也会过滤掉为NULL的数据 3、group by 的时候会把所有为NULL的数据合并,可以随机生成UUID解决 4、还有场景可能也有问题,这里我也忘记了,用的时候才会想起来。 |
2021-06-02
2021-06-05
2022-06-27
2022-10-12
2019-09-11