为什么建议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;
创建表SQL语句

 

 表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 = '张三';

 

你可能感兴趣的