NULL или НЕ NULL по умолчанию?

41

В MySQL лучше всегда разрешать нули, если вы не знаете, что поле является обязательным, или всегда использовать, Not Nullесли вы не знаете, что поле будет содержать нули? Или это не имеет значения?

Я знаю, что в некоторых СУБД говорят, что они используют Not Nullкак можно больше, потому что для разрешения значений NULL требуется дополнительный бит (или байт?) Для каждой записи для хранения статуса Null.

BENV
источник
1
Вы должны разрешить, NULLесли и только если NULLзначение имеет интерпретацию для моделируемой вещи.
jameshfisher

Ответы:

25

В большинстве БД NOT NULLстолбец будет более эффективным с точки зрения хранимых данных по причине, которую вы указали, а также более эффективным для запроса и индексации - поэтому, если вы не хотите разрешить пустые значения в столбце, вы должны явно запретить их.

Это будет иметь незначительное влияние на производительность, поскольку дополнительные NOT NULLограничения, возможно, потребуется проверять для каждой строки, на которую вы влияете, с помощью любого INSERT или UPDATE, но, поскольку большинство баз данных имеют относительную легкость записи и интенсивность чтения, это, вероятно, не является проблемой (мало дополнительное время вряд ли будет вообще заметно, поскольку это операция с привязкой к процессору, где остальная часть операции вставки / обновления будет привязана к вводу-выводу и, таким образом, гораздо более значительным узким местом), и это дает вам некоторое «бесплатное» "проверка данных, чтобы ваш код (или код других людей) не мог случайно поместить значения NULL там, где их не ожидает другой код, и поэтому может давать неверные результаты в их присутствии.

Редактировать: Как отмечает Питер в своем комментарии, вышеизложенное является обобщением и может не выполняться для всех DMBS, хотя я почти уверен, что это верно для mysql и mssql. К другим сложностям в этой области могут относиться такие функции, как разреженные таблицы (как, например, реализовано в MSSQL 2008), которые изменят динамику производительности (не) пустых столбцов.

Дэвид Спиллетт
источник
8
Это не обязательно верно в PostgreSQL. Пустые столбцы экономят место, что может повысить скорость, а время обработки должно быть примерно одинаковым.
Питер Айзентраут
4
Это также не относится к Oracle. Кроме того, в отличие от MySql, Oracle не индексирует нулевые значения, поэтому вы можете уменьшить размер ваших индексов, используя их. См. Stackoverflow.com/questions/289001/does-mysql-index-null-values
Ли Риффель
8

Вы должны принять решение о разработке схемы и требованиях к приложениям. В большинстве случаев различия в производительности, вероятно, не заметны.

Питер Айзентраут
источник
3
Еще раз, лучший способ узнать наверняка - это профилирование и тестирование.
Jcolebrand
Я был бы осторожен с такими широкими утверждениями: если вы записываете 10 миллионов строк в ночь в таблицу с помощью какого-либо ETL-процесса и в этой таблице есть несколько полей с ограничениями Not Null, вы увидите влияние на производительность.
ScottCher
1
+1: Возможно, это не так для всех приложений, но для того, что я делаю, получение согласованных / правильных данных важнее, чем экономия места или потеря скорости.
JP