Mysql避免null值
我们在设计表的时候经常被要求某些字段不能为null;那么为什么字段要求不能为null呐?如果为null又会带来什么影响呐?
这篇文章就让我们来探究一下null带来的负面影响吧。
创建一个测试的表:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`type` int(11) DEFAULT NULL COMMENT '类型',
`class` varchar(255) DEFAULT NULL COMMENT '班级',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;创建一个索引和三条数据:
create index idx_type on test(`type`);
INSERT INTO test(name, type, class) VALUES('小明', 1, "一班"),('小美', 2, '一班'),("小黑",null,'二班');
1.null会导致索引失效吗?
我们在网上经常会看到有的文章说is null会走索引,但是is not null不会走索引,原因是只要索引列的值为null那么那一列索引就是无效的,那么这个观点真的正确吗?

通过实际操作我们发现无论is null还是is not null都会走索引,显然索引列有null值索引失效的观点是错误的;通过研究发现即使索引列的值为null也是会存到索引树中的,这些null值索引的位置在索引树的最左端:

至于为什么有的is not null会不走索引,那是因为mysql优化器会计算走索引和全表扫描那个效率高,从而选择最优的方案。
2.范围查询null不包含在内:

进行范围查询时为null的数据是不会参与其中的;
3.统计列null不计入在内:

针对索引列进行统计,null不计入在内。
4.排序、分组null值会被当做相同值:

当进行排序时null值列总会出现在最前面,侧面印证了null值索引在B+树的最左边。

分组时null也会被当作一组来进行处理。
5.导致唯一索引出现重复数据:
删除之前的索引idx_type:
drop index idx_type on test添加唯一索引:
CREATE UNIQUE INDEX uidx_name_type on test(name, type)添加重复数据:
INSERT INTO test(name, type, class) VALUES("小黑",null,'二班');
null值会导致唯一索引失效,也就是说null不计入唯一索引内。
总结:我们再建表时应该避免
null值;
null查询会增加sql的复杂性;排序会导致
null列会在最前边;分组会导致
null列的数据为一组;会导致唯一索引,失去唯一性。