MySQL学习笔记:少用Null
在实际编程中,Null容易引起很多问题,例如在Java里NullPointerException猝不及防的空指针异常,因此需要过多的if判断,甚是麻烦。
在MySQL数据库中也要少用Null,尽量保持字段not null,主要原因有以下。
1.Null使用起来很方便,创建数据表时默认,插入数据的时候也不用过多判断;
2.MySQL官网文档:
Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要Mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam 中固定大小的索引变成可变大小的索引。
—— 出自《高性能mysql第二版》
3.Not in、!=等负向条件查询在有Null值的情况下返回永远为空结果,查询容易出错;
CREATE TABLE table_2 (
`id` INT (11) NOT NULL,
user_name VARCHAR(20) NOT NULL
)
CREATE TABLE table_3 (
`id` INT (11) NOT NULL,
user_name VARCHAR(20)
)
INSERT INTO table_2 VALUES (4,"zhaoliu_2_1"),(2,"lisi_2_1"),(3,"wangmazi_2_1"),(1,"zhangsan_2"),(2,"lisi_2_2"),(4,"zhaoliu_2_2"),(3,"wangmazi_2_2")
INSERT INTO table_3 VALUES (1,"zhaoliu_2_1"),(2, NULL)
SELECT * FROM table_2
SELECT * FROM table_3
SELECT user_name FROM table_2 WHERE user_name NOT IN (SELECT user_name FROM table_3 WHERE id!=1)
4.两个字段进行拼接:比如题号+分数,首先要各字段进行非Null判断,否则只要任意一个字段为空都会造成拼接的结果为null;
SELECT CONCAT("1",NULL) FROM DUAL; -- 执行结果为Null
5.如果有 Null column 存在的情况下,count(Null column)需要格外注意,null 值不会参与统计;
SELECT COUNT(user_name) FROM table_3; -- 1
6.Null列需要更多的存储空间:需要一个额外字节判断是否为Null的标志位;
alter table table_3 add index idx_user_name (user_name);
alter table table_2 add index idx_user_name (user_name);
explain select * from table_2 where user_name='lll';
explain select * from table_3 where user_name='lll';
字段为Null的列比非Null要多使用一个字节
key_len的计算规则和三个因素有关:数据类型、字符编码、是否为Null
总结:
索引字段最好不要为Null,因为Null会使索引、索引统计和值更加复杂,并且需要额外一个字节的存储空间。
END 2018-11-22 09:35:29
分类:
MySQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)