BenV Asked: 2011-01-04 15:20:37 +0800 CST2011-01-04 15:20:37 +0800 CST 2011-01-04 15:20:37 +0800 CST 默认为 NULL 还是 NOT NULL? 772 在 MySQL 中,除非您知道某个字段是必需的,否则总是允许空值,或者Not Null除非您知道一个字段将包含空值,否则总是使用它会更好吗?还是没关系? 我知道在一些 DBMS 中他们说要Not Null尽可能多地使用,因为允许空值需要每条记录额外的位(或字节?)来存储空状态。 mysql null 2 个回答 Voted Best Answer David Spillett 2011-01-04T15:28:58+08:002011-01-04T15:28:58+08:00 在大多数NOT NULL数据库中,由于您声明的原因,列在存储数据方面会更有效,并且查询和索引也更有效 - 因此,除非您想在列中允许 NULL,否则您应该明确禁止它们。 会有轻微的性能影响,因为NOT NULL可能需要检查您使用任何 INSERT 或 UPDATE 影响的每一行的额外约束,但由于大多数数据库是相对轻写和重读,这可能不是问题(小无论如何,花费的额外时间不太可能引起注意,因为它是一个受 CPU 限制的操作,其中其余的插入/更新操作将受 IO 限制,因此是一个更重要的瓶颈)并且它为您提供了一些“免费" 数据检查,因此您的代码(或其他人的代码)不会意外地将 NULL 放在其他代码不期望它们的位置,因此可能会在它们存在时给出不正确的结果。 编辑:正如彼得在他的评论中指出的那样,以上是一个普遍性,可能并不适用于所有DMBS,尽管我很确定它适用于 mysql 和 mssql。该领域的其他复杂情况可能包括稀疏表(例如,在 MSSQL 2008 中实现的)之类的特性,这些特性将改变(非)可空列的性能动态。 Peter Eisentraut 2011-01-04T21:07:13+08:002011-01-04T21:07:13+08:00 您应该让您的架构设计和应用程序需求来指导这个决定。在大多数情况下,性能差异可能并不明显。
在大多数
NOT NULL
数据库中,由于您声明的原因,列在存储数据方面会更有效,并且查询和索引也更有效 - 因此,除非您想在列中允许 NULL,否则您应该明确禁止它们。会有轻微的性能影响,因为
NOT NULL
可能需要检查您使用任何 INSERT 或 UPDATE 影响的每一行的额外约束,但由于大多数数据库是相对轻写和重读,这可能不是问题(小无论如何,花费的额外时间不太可能引起注意,因为它是一个受 CPU 限制的操作,其中其余的插入/更新操作将受 IO 限制,因此是一个更重要的瓶颈)并且它为您提供了一些“免费" 数据检查,因此您的代码(或其他人的代码)不会意外地将 NULL 放在其他代码不期望它们的位置,因此可能会在它们存在时给出不正确的结果。编辑:正如彼得在他的评论中指出的那样,以上是一个普遍性,可能并不适用于所有DMBS,尽管我很确定它适用于 mysql 和 mssql。该领域的其他复杂情况可能包括稀疏表(例如,在 MSSQL 2008 中实现的)之类的特性,这些特性将改变(非)可空列的性能动态。
您应该让您的架构设计和应用程序需求来指导这个决定。在大多数情况下,性能差异可能并不明显。