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

posted @ 2018-11-22 09:36  Hider1214  阅读(515)  评论(0编辑  收藏  举报