Ще бъда придирчив към избора на думи за момент:
- Дори и да е значителен фактор на производителността, това не го прави семантично правилно да се използва стойност вместо NULL. В SQL NULL има семантична роля, за да обозначи липсваща или неприложима стойност. Характеристиките на производителност на NULL в дадена реализация на RDBMS са независими от това. Ефективността може да варира от марка до марка или от версия до версия, но целта на 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 съществува като стойност, която по дефиниция е извън домейна на стойностите от всеки тип данни, така че можете да използвате пълния диапазон от стойности от цели числа или низове или каквото и да е и все още да имате нещо, което да означава „никоя от горните стойности. "