デフォルトでNULLまたはNOT NULLですか?


41

MySQLでは、フィールドが必須であることがわかっていない限り常にnullを許可Not Nullするか、フィールドにnullが含まれることがわかっていない限り常に使用する方が良いでしょうか?またはそれは重要ではありませんか?

いくつかのDBMS Not Nullでは、可能な限り使用するように言っていますが、これは、Nullを許可するには、レコードごとにNullステータスを保存するために余分なビット(またはバイト?)が必要だからです


1
値がモデリングしているものの解釈を持っているNULL場合にのみ許可する必要NULLがあります。
jameshfisher

回答:


25

ほとんどのDBでは、NOT NULL列は、指定した理由により格納されたデータに関してより効率的であり、クエリとインデックス作成もより効率的です。したがって、列でNULLを許可する場合を除き、明示的に禁止する必要があります。

NOT NULLINSERTまたはUPDATEの影響を受ける行ごとに余分な制約をチェックする必要がある可能性があるため、わずかなパフォーマンスへの影響がありますが、ほとんどのデータベースは相対的なライトライトとリードヘビーなので、これはおそらく問題ではありません(少し余分な時間がかかることはほとんどありません。挿入/更新操作の残りの部分がIOにバインドされるCPUバインドの操作であり、非常に重要なボトルネックです。コード(または他の人のコード)が誤ってNULLを置くことがないようにデータをチェックします。他のコードが予期しない場所にNULLを配置し、存在する場合に誤った結果を与える可能性があります。

編集:Peterが彼のコメントで指摘しているように、上記は一般論であり、すべての DMBSに当てはまるわけではありませんが、mysqlとmssqlには確かにそうです。この領域の他の複雑な問題には、nullを許可しない列のパフォーマンスダイナミクスを変更するスパーステーブル(MSSQL 2008の実装など)などの機能が含まれる場合があります。


8
これは必ずしもPostgreSQLでは当てはまりません。ヌルカラムはスペースを節約するため、速度が向上し、処理時間はほぼ同じになります。
ピーターアイゼントラウト

4
これはOracleにも当てはまりません。さらに、MySqlとは異なり、OracleはNULLのインデックスを作成しないため、NULLを使用してインデックスのサイズを削減できます。参照してくださいstackoverflow.com/questions/289001/does-mysql-index-null-values
リーRiffel

8

スキーマ設計とアプリケーションの要件に基づいてこの決定を行う必要があります。ほとんどの場合、パフォーマンスの違いはおそらくどちらの場合でも顕著ではありません。


3
繰り返しますが、確実に知る最良の方法は、プロファイリングとテストです。
jcolebrand

このような広範なステートメントには注意が必要です。ETLプロセスを介して1晩に1,000万行をテーブルに書き込み、そのテーブルにNot Null制約フィールドがたくさんある場合、パフォーマンスへの影響がわかります。
-ScottCher

1
+1:すべてのアプリケーションに当てはまるわけではありませんが、スペースを節約したり速度を落とすよりも、一貫性のある/正しいデータを取得することが重要です。
jp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.