少しの間、単語の選択について気を悪くするつもりです:
- それが重要なパフォーマンス要因であったとしても、それは意味論的ににはなりません。 NULLの代わりに値を使用するように修正してください。 SQLでは、NULLには意味的な役割があり、欠落している値または適用できない値を示します。特定のRDBMS実装におけるNULLのパフォーマンス特性は、これとは無関係です。パフォーマンスはブランドごと、またはバージョンごとに異なる場合がありますが、言語でのNULLの目的は一貫しています。
いずれにせよ、NULLのパフォーマンスが悪いという証拠は聞いたことがありません。 null許容列が非null許容列よりもパフォーマンスが悪いことを示すパフォーマンス測定値への参照に興味があります。
私が間違っていない、または場合によっては真実ではないということではありません。ただ、怠惰な仮定をすることは意味がないということです。科学は推測で構成されていません。繰り返し可能な測定で証拠を示さなければなりません。
指標は、どのくらいでもわかります パフォーマンスが異なるので、心配する価値があるかどうかを判断できます。つまり、影響は測定可能でゼロではない可能性がありますが、テーブルの適切なインデックス作成やデータベースキャッシュのサイズ設定など、より優れたパフォーマンス要因と比較すると、それでも重要ではありません。
MySQLでは、NULLの検索はインデックスの恩恵を受けることができます:
mysql> CREATE TABLE foo (
i INT NOT NULL,
j INT DEFAULT NULL,
PRIMARY KEY (i),
UNIQUE KEY j_index (j)
);
mysql> INSERT INTO foo (i, j) VALUES
(1, 1), (2, 2), (3, NULL), (4, NULL), (5, 5);
mysql> EXPLAIN SELECT * FROM foo WHERE i = 3;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | foo | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
mysql> EXPLAIN SELECT * FROM foo WHERE j IS NULL;
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | foo | ref | j_index | j_index | 5 | const | 2 | Using where |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
それはまだパフォーマンスの測定ではないことに注意してください。 NULLの検索中にインデックスを使用できることを示しただけです。インデックスの利点は、空白の文字列に対してNULLを検索するときに発生する可能性のあるペナルティを覆い隠すことを主張します(確かに測定はしていませんが、これは単なるStackOverflowです)。
NULLの代わりにゼロ、空白、またはその他の値を選択することは、正しい設計上の決定ではありません。これらの値を列で重要なものとして使用する必要がある場合があります。そのため、NULLは、定義上、任意のデータ型の値のドメイン外の値として存在します。したがって、整数や文字列などの値の全範囲を使用しても、「上記の値のいずれでもない」ことを意味するものがあります。 "