相信很多人在设计数据库的时候都会遵循一个原则: 字段尽量不要使用NULL,但是对其背后的原因却了解的比较少,笔者也是一样的。下面笔者收集了一些关于它的原因。
- 如果sql 语句是一个不等于的查询,那么值为NULL的列将不会被查出,例如:
select * from user where name != '张山';
如果name 列有为空的值,那么name=null 的记录将查不出来。 - MySQL NULL 值其实是占用空间的,注意NULL值和空值是不一样的。借用官方的一段话:
“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.” - 程序很少说要使用到NULL的值,如果查出为NULL的值,反倒要做一些特殊的处理。
-
有的时候判断字段是否为NULL和是否不为NULL将会使得索引失效,例如这样一张表:
表.png
在字段name 上加有一个index 索引,下面来分析一条sql语句:
EXPLAIN SELECT * FROM user_login_log WHERE NAME IS NULL;
执行结果:
结果.png
从explain 的结果来看这里这里并没有走索引。下面笔者再删除几条记录看下结果:
表.png
同样的sql语句,这里就不重复写了,下面直接来看分析结果:
结果.png
发现这个时候使用到了索引,为啥会这样呢? 其实查询优化器会去判断到底是走索引快还是扫表快,那种更快就使用哪个。
- 其实设置为非NULL带来的效率提升是很小的,除非真的确定是NULL带来了性能的问题,否则优化的时候一般不会去加个not null ,不过建议各位小伙伴在数据库设计之初的时候就字段尽量设置为非NULL。
网友评论