Однако я часто читал о
проблемы с производительностью, когда поля
обнуляется и было рекомендовано использовать
пустая строка в случаях, когда NULL
на самом деле семантически правильно.
Я собираюсь быть придирчивым к выбору слов на мгновение:
- Даже если бы это был значительный фактор производительности, это не делает семантически правильным для использования значения вместо NULL. В SQL 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 как значение, которое по определению находится за пределами области значений любого типа данных, так что вы можете использовать полный диапазон значений целых чисел или строк или чего угодно, и при этом все еще есть что-то, что можно обозначить "ни одним из вышеприведенных значений. «