Mysql避免null值


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列的数据为一组;

会导致唯一索引,失去唯一性。


文章作者: 威@猫
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 威@猫 !
评论