django做网站比较容易,ui设计入门教程,甘肃建设厅职称查询官方网站,培训班网站建设在Mysql中很多表都包含可为NULL(空值)的列#xff0c;即使应用程序并不需要保存NULL也是如此#xff0c;这是因为可为NULL是列的默认属性。但我们常在一些Mysql性能优化的书或者一些博客中看到观点#xff1a;在数据列中#xff0c;尽量不要用NULL 值#xff0c;使用0即使应用程序并不需要保存NULL也是如此这是因为可为NULL是列的默认属性。但我们常在一些Mysql性能优化的书或者一些博客中看到观点在数据列中尽量不要用NULL 值使用0-1或者其他特殊标识替换NULL值除非真的需要存储NULL值那到底是为什么如果替换了会有什么好处同时又有什么问题呢那么就看下面(1)如果查询中包含可为NULL的列对Mysql来说更难优化因为可为NULL的列使得索引索引统计和值比较都更复杂。(2)含NULL复合索引无效.(3)可为NULL的列会使用更多的存储空间在Mysql中也需要特殊处理。(4)当可为NULL的列被索引时每个索引记录需要一个额外的字节在MyISAM里甚至还可能导致固定大小的索引(例如只有一个整数列的索引)变成可变大小的索引。理由佐证理由1不需要佐证首先新建环境, sql语句如下create table nulltesttable(id int primary key,name_not_null varchar(10) not null,name_null varchar(10)) ENGINEInnoDB DEFAULT CHARSETutf8 AUTO_INCREMENT1;alter table nulltesttable add index idx_nulltesttable_name_not_null(name_not_null);alter table nulltesttable add index idx_nulltesttable_name_null(name_null);explain select * from nulltesttable where name_not_nullname; // explain1explain select * from nulltesttable where name_nullname; // explain2从sql 执行可以看出, explain1中 key_len 32, explain2中 key_len 33explain1的32 由来: 10(字段长度) * 3(utf8字符编码占用长度) 2(varchar标识为变长占用长度)explain2的32 由来: 10(字段长度) * 3(utf8字符编码占用长度) 2(varchar标识为变长占用长度) 1(null标识位占用长度)两个字符串拼接, 如果包含null值, 则返回结果为null.insert into nulltesttable(id,name_not_null,name_null) values(1,one,null);insert into nulltesttable(id,name_not_null,name_null) values(2,two,three);select concat(name_not_null,name_null) from nulltesttable where id 1; -- out: nullselect concat(name_not_null,name_null) from nulltesttable where id 2; -- out: twothree如果字段允许null值, 且这个字段被索引. 如下的查询可能会返回不正确的结果select * from nulltesttable where name_null three -- out: nullselect count(name_null) from nulltesttable -- out: 1通常把可为NULL的列改为NOT NULL 带来的性能提升比较小所以(调优时)没有必要首先在现有schema中查找并修改掉这种情况除非确定这会导致问题。但是如果计划在列上建索引就应该尽量避免设计成可为NULL的列。当确实需要标识未知值时也不要害怕使用NULL。在一些场景中使用NULL可能会比某个神奇常数更好。从特定类型的值域中选择一个不可能的值例如用-1代表一个未知数可能导致代码复杂的多并容易引入BUG还可能让事情变得一团糟(注Mysql会在索引中存储NULL值Oracle不会)。当然也有例外InnoDB使用单独的位(bit)来存储NULL值所以对于稀疏数据(很多值位NULL只有少数行的列有非NULL值)由很好的空间效率这一点不适用于MyISAM。所以任何的设计和考虑请注意关注实际需求到此这篇关于浅谈为什么Mysql数据库尽量避免NULL的文章就介绍到这了,更多相关Mysql避免NULL内容请搜索站圈网以前的文章或继续浏览下面的相关文章希望大家以后多多支持站圈网