之前看到有人问到PHPHub迁移数据库文件中可空和索引的问题,相信很多用了MySQL很久的人(特别是平时过多关注业务开发的人),对这两个字段属性的概念还不是很清楚,一般会有以下疑问:
我字段类型是不空,为什么我可以插入空值;
为毛not null的效率比空高;
判断字段不为空的时候,到底要列& lt;比;& # 39;& # 39;还是要用列不是零呢。
带着上面几个疑问,我们来深入研究一下零和not null到底有什么不一样。
<强>零和空值一样么强>
首先,我们要搞清楚空值和空的概念:
空值是不占用空间的;
MySQL中的空其实是占用空间的、下面是来自于MySQL官方的解释:
空列需要额外空间行记录它们的值是否为空。MyISAM表,每个NULL列>创建表“测试”( 的col1 VARCHAR(10)字符集utf8核对utf8_general_ci非空, col2 VARCHAR(10)字符集utf8核对utf8_general_ci NULL )=MYISAM引擎;
问题1:我字段类型是不空,为什么我可以插入空值吗?
执行下面的SQL,发生错误,提示列& # 39;col1 # 39;不能空。
插入测试的值(空1);再来一条,执行成功。
插入“测试”值(& # 39;& # 39;1);可见,非空的字段是不能插入空的(这不是废话么,),只能插入空值,上面的问题1也就有答案了。
问题2:为毛NOT null的效率比空高?
对于问题2,上面我们已经说过了,空其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,零会参与字段比较,所以对效率有一部分影响。
而且B树索引时不会存储null值的,所以如果索引的字段可以为null,索引的效率会下降很多。
问题3:判断字段不为空的时候,到底要column<祝辞& # 39;& # 39;还是要用列不是零呢。
我们再向测试的表中插入几条数据:
插入“测试”值(& # 39;& # 39;零); 插入“测试”值(& # 39;1 & # 39;& # 39;2 & # 39;);现在根据需求,我要统计测试表中col1不为空的所有数据,我是该用& lt;祝辞& # 39;& # 39;还是没有空呢,让我们来看一下结果的区别。
现在表中的数据如下:
分别对照以下两句SQL的执行效果
SELECT *从“测试”col1不是空
SELECT *从“测试”col1 & lt;比;& # 39;& # 39;
可以看的到,结果迥然不同,所以我们一定要根据业务需求,搞清楚到底是要用那种搜索条件,以及要不要为NULL。
<>强自己遇到的一个小坑强>
在许久以前刚入职做第一个需求上线的时候,只一味注意到说是NOT NULL的效率比零的效率高。
好嘛~自己在现有的表上增加字段时全设置为了不是NULL,感觉自己屌屌的。
因为许多服务都有操作这个表的插入动作,结果可想而知,刚上线,错误& # 39;列col1 # 39;不能空弥漫了整个开发组每个人的邮箱。
所以,当业务量不是很大的情况下,很多技术的使用其实都需要根据实际状况综合考虑。
以上就是MySQL中零和NOT null详解的详细内容,更多请关注其它相关文章!
MySQL中零和NOT NULL一样吗?