在MySQL中,除非您知道必填字段,否则始终允许为null更好,或者除非您知道字段将包含null,否则始终使用Not Null更好?还是没关系?

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

评论

当且仅当NULL值对要建模的事物有解释时,才应允许NULL。

#1 楼

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

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

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

评论


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

– Peter Eisentraut
2011年1月4日,下午5:04

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

–雷·里菲尔(Leigh Riffel)
2011年1月5日在21:45

#2 楼

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

评论


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

– jcolebrand♦
2011年1月5日,下午5:27

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

–ScottCher
2011年1月5日15:21

+1:也许并非所有的应用程序都适用,但是对于我正在做的事情,获取一致/正确的数据比节省空间或降低速度更为重要。

– j.p.
2011年1月13日在9:14