在MySQL中使用default null或default ""用于文本字段更好吗?
为什么?
更新:我知道他们每个人的意义.我感兴趣的是考虑磁盘空间和性能更好.
更新2:嘿ppl!问题是"什么是更好用"而不是"每个意味着什么"或"如何检查它们"......
Jam*_*mes 54
对于MyISAM表,NULL为每行的每个NULLABLE列(空位)创建一个额外的位.如果列不是NULLABLE,则永远不需要额外的信息.但是,它被填充为8位字节,因此对于NULLABLE列的计数,您总是获得1 + mod 8字节.1
文本列与其他数据类型略有不同.首先,对于"",表条目保存字符串的两个字节长度,后跟字符串的字节,并且是变量长度结构.在NULL的情况下,不需要长度信息,但它仍然作为列结构的一部分包含在内.
在InnoDB中,NULLS不占用空间:它们根本不存在于数据集中.对于空字符串也是如此,因为数据偏移也不存在.唯一的区别是NULL将设置NULL位,而空字符串不会.2
当数据实际布局在磁盘上时,NULL和''在两种数据类型中完全占用相同的空间.但是,当搜索该值时,检查NULL会比检查''稍微快一些,因为您不必考虑计算中的数据长度:您只检查空位.
由于NULL和''空格不同,NULL和''没有SIZE IMPACT,除非指定列是否为NULL.如果列是非NULL,只有在MyISAM表中才会看到任何性能差异(然后,显然,不能使用默认的NULL,因此这是一个没有实际意义的问题).
真正的问题归结为"没有设置值"列的应用解释.如果""是一个有效值,意思是"用户在此处输入任何内容"或某些内容,则默认为NULL,因为您希望在输入没有数据的记录时区分NULL和"".
通常,默认实际上只对重构数据库有用,因为新值需要对旧数据生效.在这种情况下,再次,选择取决于如何解释应用程序数据.对于某些旧数据,NULL非常合适且最适合(列之前不存在,因此它现在具有NULL值!).对于其他人来说,""更合适(通常在查询使用SELECT*和NULL时会导致崩溃问题).
在ULTRA-GENERAL TERMS中(以及从哲学角度来看)NULLABLE列的默认NULL是首选,因为它提供了"No Value Specified"的最佳语义解释.
1 [ http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]
2 [ http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]
Pau*_*ier 41
使用默认值null.在SQL中,null与空字符串("")非常不同.空字符串具体表示该值设置为空; null表示未设置该值,或者设置为null.你看,有不同的含义.
不同的含义及其不同的用法是为什么在适当时使用它们的重要性; 通过使用default null相对于可能节省的空间量default ""是如此之小以至于它接近于可忽略性; 但是,使用适当的默认值作为惯例的潜在价值是非常高的.
Gry*_*har 22
尽可能避免使用NULL. 即使应用程序不需要存储NULL(缺少值),许多表也包含可空列,仅仅因为它是默认值.除非您打算在其中存储NULL,否则通常最好将列指定为NOT NULL.MySQL更难以优化引用可空列的查询,因为它们使索引,索引统计和值比较更加复杂.可空列使用更多存储空间,并且需要在MySQL内部进行特殊处理.当索引可空列时,每个条目需要一个额外的字节,甚至可以在MyISAM中将固定大小的索引(例如单个整数列上的索引)转换为可变大小的索引.从更改NULL列到NOT NULL的性能改进通常很小,因此除非您知道它们导致问题,否则不要优先在现有模式上查找和更改它们.但是,如果您计划索引列,请尽可能避免使其可为空.当然也有例外.例如,值得一提的是InnoDB只用一个位存储NULL,因此对于稀疏填充的数据来说它可以非常节省空间.但这不适用于MyISAM.
deg*_*ate 11
我发现NULL vs""在磁盘空间和性能方面是微不足道的.
我可以亲自看到在''上使用NULL的唯一真正原因是当你有一个标记为UNIQUE但需要能够允许多个"空"列的字段时.
例如,我的用户表中的电子邮件列仅在某人实际拥有电子邮件地址时填写.没有电子邮件地址的人都会获得NULL.我仍然可以使这个字段唯一,因为NULL不算作值,而空字符串''是.
很多人都在回答null和之间的区别'',但是OP要求占用的空间更少/更快,所以这是我对它的抨击:
答案是,这取决于.如果你的字段是a char(10),如果没有设置,它将总是需要10个字节null,因此null占用的空间更少.按行分钟,但超过数百万行,这可能会增加.我相信即使是一个varchar(10)将一个字节(\0)存储为一个空字符串,所以再次这可能会超过巨大的表.
在查询性能方面,null理论上更快速地进行测试,但我还没有看到能够在索引良好的表上提出任何明显的差异.但请记住,如果这是期望的回报,您可能必须转换null到''应用程序端.同样,逐行,差异很小,但它可能会加起来.
总而言之,这是一种微观优化,因此归结为偏好.我的偏好是使用null因为我想知道那里没有值,而不是猜测它是一个空字符串('')还是一堆空格(' ').null本质上是明确的.''不是.因此,我选择null因为我是一个明确的人.
| 归档时间: |
|
| 查看次数: |
30742 次 |
| 最近记录: |