当前位置:首页 > 好文分享 > 正文

字段定义不要用null的原因分析 mysql

字段定义不要用null的原因分析 mysql

Mysql,字段定义不要用null。智伯。com将带你了解更多的信息。 为什么在java中经常使用NULL? Null是一个让人头疼的问题,比如java中的...

Mysql,字段定义不要用null。智伯。com将带你了解更多的信息。 为什么在java中经常使用NULL? Null是一个让人头疼的问题,比如java中的NullPointerException。为了避免猝不及防的空指针,需要仔细判断是否,既麻烦又臃肿。 由于这个原因,有很多开源包有很多处理方法。 commonlang3的string utils . is blank();collection utils . isempty(); 番石榴是可选的 甚至java8也推出了Optional来避免这个问题(类似于guava的,用法上有一点变化)。 (2)为什么2)mysql的null会被滥用? (a)创建非标准null是创建数据表时的默认设置,一些mysql客户端可能不会在其自动生成的table语句中指定notnull。 (b)有些人认为notnull需要更多的空间。 (c)开发中不需要判断插入的数据,写null更方便。 2.官方文档:nullcolumnsrequireddialspaceinthroortordwhethelvaluesarenul。formyisamtables,eahnullcolumntakesonebitextra,roundeduptothenearestbyte。 Mysql很难优化引用可空列的查询,这会使索引、索引统计和值变得更加复杂。可空列需要更多的存储空间和mysql内部的特殊处理。对可空列进行索引后,每条记录都需要一个额外的字节,这也可能导致MYisam中的固定大小索引变成可变大小索引。《高性能mysql第二版》的—— 这样,不指定notnull没有性能优势。 mysql不使用null的三个原因(1)所有使用NULL值的情况都可以用一个有意义的值来表示,有利于代码的可读性和可维护性,可以从约束上增强业务数据的标准化。 (2)从2)空值到非空值的更新无法更新到位,更容易发生索引拆分,从而影响性能。(null-notnull的性能提升非常小,除非你确定它带来了问题,否则不要把它作为优先优化措施。) (3)空值在时间戳类型下容易出问题,尤其是在参数Explicit _ Defaults _ for _ timestamp没有启用的情况下。 (4)NOTIN,当存在空值时,等于负条件查询总是返回空结果,并且查询容易出错。 由四个空值初始化的坏情况数据:【字段定义不要用null的原因分析mysql】创建table1 (` id` int (11) not null,` name` varchar (20) not null)创建table2 (` id` int (11) not null,` name` varchar (20))插入table1values(4,'赵云'),(2,'张飞'),(3,'刘备')插入table2values(1,'赵云'(2,null) (1)当存在空值时,1)NOTIN子查询将返回始终为空的结果,并且查询容易出错。 selectnamefromtable 1 where name notin(selectnamefromtable 2 where id!=1) - |姓名|| - | - (2)列值允许为空,索引不存储空值,这些记录不会包含在结果集中。 select * fromtable2wherename!='赵云' ---| id |姓名| |-| | |-- select * fromtable2wherename!='兆云1 ' ---| id |姓名| |-| 1 |赵云| - - (3)使用concat拼接时,首先要判断每个字段是否非空,否则只要有一个字段为空,拼接结果就为空。 selectconcat('1 'null)fromdual。 - |concat('1 'null)|| - ||NULL| - (4)统计count时,nullcolumn将不计入统计。 select count(name)from table 2; - |count(用户名)|| - ||1| - 五个索引长度比较alterable table 1 addidexdx _ name(name);alter tabletable 2 addindexidx _ name(名称);explain select * from table 1 where name='赵云'explain select * from table 2 herename='赵云' 表1的key _ len=82 表2的key _ len=83 key_len的计算规则与三个因素有关:数据类型、字符编码和是否为空。 Key_len82=20*4(utf8mb4-4字节,utf8-3字节)varchar变长字符长度为2字节,定长字段不需要额外的字节)。 Key_len83=20*4(utf8mb4-4字节,utf8-3字节)varchar变长字符长度为2字节,定长字段不需要额外的字节)1(是否为空)。 因此,最好不要将索引字段留空,因为NULL会使索引、索引统计和值变得更加复杂,并且需要额外的一个字节的存储空间。 这里,这篇关于mysql字段定义不使用null的分析文章就介绍到这里。关于mysql字段定义null的更多信息,请搜索有趣的新闻。以前的文章或者继续浏览下面的相关文章。希望大家以后支持有趣的新闻!

发表评论

最新文章