默认为NULL还是NOT NULL?


41

在MySQL中,除非您知道必须填写字段,否则始终允许使用null还是在Not Null您知道字段将包含null的情况下始终使用更好?还是没关系?

我知道在某些DBMS中,他们说要Not Null尽可能多地使用,因为允许空值需要每条记录额外的位(或字节?)来存储Null状态。


1
NULL仅当该NULL值对要建模的事物有解释时,才应允许。
jameshfisher 2014年

Answers:


25

在大多数NOT NULL数据库中,出于您陈述的原因,列在存储数据方面将更加高效,并且查询和索引也将更加高效-因此,除非您想在列中允许NULL,否则应明确禁止它们。

这将对性能产生轻微的影响,因为NOT NULL可能会对使用任何INSERT或UPDATE影响的每一行都检查额外的约束,但是由于大多数数据库都是相对轻量级和重载型的,因此这可能不是问题(稍无论如何,额外花费的时间不太可能会引起注意,因为这是CPU绑定的操作,其余的插入/更新操作将是IO绑定的,因此是一个更为重要的瓶颈),它为您提供了一些“免费”数据检查,这样您的代码(或其他人的代码)就不会在其他代码不期望使用NULL的地方意外插入NULL,因此在它们存在的情况下可能会给出错误的结果。

编辑:正如彼得在他的评论中指出的那样,上述内容是一种普遍性,可能并不适用于所有 DMBS,尽管我很确定它适用于mysql和mssql。该领域的其他复杂情况可能包括稀疏表之类的功能(例如,已实施的MSSQL 2008),这些功能将改变(不可空)列的性能动态。


8
在PostgreSQL中不一定是这样。空列可节省空间,可提高速度,并且处理时间应大致相同。
Peter Eisentraut 2011年

4
对于Oracle也不是这样。另外,与MySql不同,Oracle不索引空值,因此您可以使用它们减少索引的大小。参见stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel

8

您应该让您的架构设计和应用程序需求指导这一决定。在大多数情况下,两种方法的性能差异可能都不明显。


3
再一次,确定的最佳方法是分析和测试。
jcolebrand

对于这样宽泛的语句,我会小心翼翼-如果您通过某个ETL流程每晚将一千万行写入表中,并且该表中有一堆Not Null约束字段,那么您会看到性能影响。
ScottCher 2011年

1
+1:也许并非所有应用程序都如此,但是对于我正在做的事情,获取一致/正确的数据比节省一些空间或降低速度更为重要。
jp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.