ただし、フィールドがnull可能である場合のパフォーマンスの問題についてよく読んでおり、NULLが実際に意味的に正しい場合は、空の文字列を使用するようにアドバイスされています。
私は少しの間、単語の選択について気まぐれになります:
- それが重要なパフォーマンス要因であったとしても、それは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の検索中にインデックスを使用できることを示しただけです。私は(確かに測定していませんが、これは単なるStackOverflowです)、NULLと空白の文字列を検索するときに、インデックスの利点がペナルティの可能性を覆い隠していると断言します。
NULLの代わりにゼロ、空白、またはその他の値を選択することは、正しい設計上の決定ではありません。これらの値を列で重要なものとして使用する必要がある場合があります。そのため、NULLは、定義上、任意のデータ型の値のドメイン外の値として存在します。したがって、整数や文字列などの値の全範囲を使用しても、「上記の値のいずれでもない」ことを意味するものがあります。 「」