mysql に null ではなくデフォルト値を指定することが推奨されるのはなぜですか?

1.公式原文

まず、この問題を理解する前に、mysql 公式ドキュメントの原文を読んでみましょう。
ここに画像の説明を挿入します

NULL 列には、値が NULL であるかどうかを記録するために行に追加のスペースが必要です。各 NULL 列には 1 ビット余分に取り、最も近いバイトに切り上げられます。翻訳してみましょう: NULL 列には、値が NULL であるかどうかを記録するために行に追加のスペースが必要です
NULL . NULLです。
空の各列には、最も近いバイトに丸められた追加ビットが必要です

多くの人は、null はデータベース内のスペースを占有しないと言っていますが、これは、この答えが自然に壊れていることを意味します。関係者は、null 列を記録するには追加のスペースが必要であると述べました。当然、スペースが必要な場合は、テストにパスして
、具体的な効果:
ここに画像の説明を挿入します
この SQL から、空の文字列の長さは 0 であり、スペースを占有していません。上記のように、1 は長さを占有し、null の長さは null であることがはっきりとわかります。図では、null には余分なスペースが必要であることが示されています。 null かどうかを記録する行ですが、実際にはスペースを占有します。

それだけでなく、null とほとんどの計算は結果を生成しません。null のみが生成されます。null
ここに画像の説明を挿入します
ここに画像の説明を挿入します
にリンクできる唯一のキーワードは、mysql によって指定された少数のキーワード、is null、is not null、<=>、さらには一般的に使用される = は null とは何の関係もなく (mysql は true の場合は 1、false の場合は 0 を返します)
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
、一部の関数の計算の最終結果にも影響します。
ここに画像の説明を挿入します

ここに画像の説明を挿入します
count (フィールド) 関数は私たちにはあまり使用されませんが、計算の結果に影響を与えていることが明らかです。count (フィールド) の数は明らかに count (*) 以下です。

Zhihu@geikexiaojun からの文の借用:
一般的な意味: ('') 文字列の NULL 値は何も入っていない真空遷移カップのようなものですが、NULL 値は空気で満たされたカップですが、見た目はすべて同じです。 、しかし本質的な違いがあります

2. null 設定の隠れた危険性

MySQL では、NULL フィールドが推奨されない主な理由がいくつかあります。

  1. データの一貫性: NULL 値によりデータの不整合が生じる可能性があります。フィールドに NULL を許可すると、値を含めることができなくなり、データのクエリおよび処理時に予期しない結果が生じる可能性があります。たとえば、数学的計算に NULL 値を使用すると、予期しない結果が生じる可能性があります。

  2. クエリの複雑さ: NULL 値を使用すると、クエリの複雑さが増加する可能性があります。データをクエリするときは、一部のフィールドの NULL 値によって引き起こされる操作の失敗など、NULL 値の特殊なケースを処理する必要があり、クエリ ロジックとコードが複雑になる可能性があります。

  3. 記憶域スペース: NULL 値には追加の記憶域スペースが必要です。NULL を許可するフィールドごとに、MySQL は NULL 値を表すためにフィールド用の追加スペースを予約する必要があるため、データ テーブルのストレージ要件が増加します。

  4. インデックスの効率: NULL 値はインデックスの効率を低下させる可能性があります。フィールドに NULL を許可すると、そのフィールドのインデックスが大きくなり、疎になる可能性があり、クエリのパフォーマンスに一定の影響を及ぼします。MySQL では、IS NULL クエリ条件を使用するときにインデックスを使用できます。ただし、使用するにはいくつかの条件を満たす必要があります。
    4.1 NULL 値はまれです。NULL 値が多数ある場合、ほとんどの行ではインデックスを使用するよりもテーブル全体のスキャンの方が高速であるため、MySQL はインデックスの使用を放棄してテーブル全体のスキャンを実行することを選択することがあります。
    4.2 であり、インデックス列に重複する値はありません。インデックス付きカラムに重複する NULL 値がある場合、インデックス内の NULL 値を見つけるために複数のインデックス エントリをスキャンする必要があるため、MySQL はインデックスの使用を放棄することがあります。
    4.3 IS NULL の代わりに等号演算子を使用します。=NULL を使用してクエリを実行すると、等号演算子が NULL 値に対して機能しないため、MySQL はインデックスを使用しない可能性があります。

3. まとめ

データベース スキーマを設計するときに、フィールドに値を格納することが予想される場合は、デフォルト値または非 null 制約を使用して、NULL 値の生成を回避できます。デフォルト値を使用すると、フィールドには常に有効な値が含まれるようになり、非 null 制約により、フィールドが null になることは許可されなくなります。これにより、クエリ ロジックが簡素化され、データベースのパフォーマンスと信頼性が向上します。フィールドに不明な値または欠損値を格納する必要がある場合は、NULL の代わりに空の文字列 ("") や特定の識別値などの特別なプレースホルダー値を使用することを検討してください。

おすすめ

転載: blog.csdn.net/weixin_52796198/article/details/131538878