为什么建议MySQL列属性尽量用NOT NULL
在《高性能MySQL》中提到,通常情况下最好指定列为NOT NULL,除非真的需要存储NULL值。虽然把NULL 改成NOT NULL 对索引的性能并没有明显提升,但可能会出现不必要的麻烦。
测试如下:
CREATE TABLE `t1` ( `id` int(11) NOT NULL, `name` VARCHAR(25) NOT NULL, PRIMARY KEY (`id`), KEY `idx_name` (`name`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; CREATE TABLE `t2` ( `id` int(11) NOT NULL, `name` VARCHAR(25) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_name` (`name`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;
表t1
表t2
1.NOT IN、!= 等负向条件查询在有 NULL 值的情况下返回空行的结果集
SELECT * from t2 where name != '张三';
select * from t2 where name not in (select name from t2 where id!=1)
2.使用 concat 函数拼接时,首先要对各个字段进行非 NULL 判断,否则只要任何一个字段为空都会造成拼接的结果为 NULL
SELECT CONCAT("1",NULL);
3.当用count函数进行统计时,NULL 列不会计入统计
SELECT count(name) from t2;
4、查询空行数据,用 is NULL
SELECT * FROM t2 where name is NULL;
5、NULL 列需要更多的存储空间,一般需要一个额外的字节作为判断是否为 NULL 的标志位。
explain SELECT * from t1 where name = '张三';
explain SELECT * from t2 where name = '张三';