Однако я часто читал о проблемах производительности, когда поля nullable и рекомендуемый использовать пустую строку в случаях, где ПУСТОЙ УКАЗАТЕЛЬ на самом деле семантически корректен.
я собираюсь быть придирчивым в отношении гниды в отношении выбора слова на мгновение:
В любом случае, я не услышал ни о каком доказательстве, что ПУСТОЙ УКАЗАТЕЛЬ работает плохо. Я интересовался бы любыми ссылками на измерения производительности, которые показывают, что nullable столбцы работают хуже, чем не допускающие NULL-значения столбцы.
я не говорю, что не ошибаюсь или что это не может быть верно в некоторых случаях - просто, что это не значимо для создания неактивных гипотез. Наука не составлена из догадки; нужно привести доказательство с повторяемыми измерениями.
Метрики также говорят Вам , насколько производительность отличается, таким образом, можно сделать суждение о том, является ли это чем-то к стоящему вызвать беспокойство о. Таким образом, влияние могло быть измеримым и ненулевым, но все еще незначительным по сравнению с большими показателями производительности, таким как правильно делительно-поворотные столы или калибровка Вашего кэша базы данных.
MySQL In, поиски ПУСТОГО УКАЗАТЕЛЯ могут извлечь выгоду из индекса:
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 |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
Примечание это все еще не измерение производительности. Я только показал, что можно использовать индекс при поиске ПУСТОГО УКАЗАТЕЛЯ. Я собираюсь утверждать (по общему признанию не имея размеры, но эй это - просто StackOverflow), что преимущество индекса омрачает любой возможный штраф при поиске ПУСТОГО УКАЗАТЕЛЯ по сравнению с пустой строкой.
Это не корректное проектное решение выбрать нуль или пробел или любое другое значение для заменения ПУСТОЙ УКАЗАТЕЛЬ. Вы, возможно, должны использовать те значения в качестве значительных в столбце. Вот почему ПУСТОЙ УКАЗАТЕЛЬ существует как значение, которое является по определению вне домена значений любого типа данных, таким образом, можно использовать полный спектр значений целых чисел или строк или безотносительно и все еще иметь что-то для выражения "ни одного из вышеупомянутых значений".
Руководство MySQL на самом деле имеет хорошую статью [приблизительно 110] проблемы с ПУСТЫМ УКАЗАТЕЛЕМ.
Hope это помогает.
Также нашел это другим ТАК сообщение о ПУСТОМ УКАЗАТЕЛЕ и Производительности
Мы не позволяем Нулевые значения в наших базах данных, если это не для числовых значений, или для дат. Причина, почему мы делаем это, состоит в том, потому что числовые значения иногда не должны приниматься значение по умолчанию для обнуления, как это очень, очень плохо. Я - разработчик для биржевые маклеры и существует большая, большая разница между ПУСТОЙ УКАЗАТЕЛЬ и 0 . Использование ОБЪЕДИНЯЕТ, пригождается, если мы действительно хотим к значениям по умолчанию назад обнулить даже при том, что мы не храним их как таковой.
MyVal = COALESCE(TheData, 0)
, Как мы, объем вставляет данных из плоских файлов, мы используем файлы формата для определения записи данных, которые автоволшебно преобразовывают пустые значения в пустые строки так или иначе.
значение по умолчанию Дат к любому значению может появиться иждивенец на сопоставлении, которому я верю, но наши значение по умолчанию к чему-то как 1900, и снова, даты чрезвычайно важны. Другие значения простого текста не так важны, и, если оставлено незаполнены, обычно квалифицируют как хорошо.
Обычно, если атрибут требуется, он определяется как Не ПУСТОЙ и если он может быть опущен, он определяется как nullable.
Пустая строка не должна использоваться вместо NULL
. NULL
ничего не представляет, где, поскольку пустая строка - что-то ни с чем внутри. NULL
всегда будет ложь, когда по сравнению с другим значением (даже NULL
) и NULL
не будет суммирован в эти COUNT
функция.
, Если необходимо представить неизвестную информацию, нет никакой замены к NULL
.
Основное преимущество, конечно, является семантическим значением ПУСТОГО УКАЗАТЕЛЯ, который Вы упомянули.
В дополнение к тому - и это может зависеть от Вашего механизма устройства хранения данных, как всегда, проверить документацию - но в, по крайней мере, некоторых базах данных, АННУЛИРУЕТ, поднимают намного меньше комнаты, чем регулярное значение. Например, если Вам объявили, что "varchar" столбец 20 символов, и это редко заполнено в, можно сохранить большое дисковое пространство путем создания его ПУСТЫМ вместо пустой строки.
я никогда не слышал ни о каких проблемах производительности с использованием, АННУЛИРУЕТ, один противоположное. Я услышал о людях, пачкающих их количества, потому что они рассчитали, АННУЛИРУЕТ неправильно, но никогда производительность. Если это - реальная вещь, я хотел бы услышать об этом!
Значение столбца NULL более или менее, "не применяется в этом контексте". Я обычно использую столбцы NULL в двух случаях:
closed_at
и is_closed
), я просто создаю closed_at столбец и устанавливаю его в NULL, если набор материально-технических ресурсов может все еще быть изменен, но назначил дату, как только он закрывается. В основном это сводится к тому, что я использую ПУСТОЙ УКАЗАТЕЛЬ, когда пустое из поля имеет различное уникальное семантическое, чем просто пустое поле. Отсутствие средней начальной буквы - просто это. Отсутствие даты закрытия имеет значение набора материально-технических ресурсов, все еще являющегося открытым для изменений.
Нулевые значения могут иметь противные побочные эффекты, и они сделают жизнь тяжелее для Вас для добавления данных к таблице и как правило, можно закончить с путаницей Нулевых значений и пустых строк, например.
кроме того, ПУСТОЙ УКАЗАТЕЛЬ не равен ничему, которое завинтит запросы повсеместно, если Вы не будете очень осторожны.
Лично, я использую столбцы NULL только, когда один из вышеупомянутых двух случаев применяется. Я никогда не использую его для выражения пустых полей, когда пустое не имеет никакого значения кроме отсутствия значения.
Любой обладающий чувством собственного достоинства механизм базы данных в эти дни не должен предлагать штраф за то, что правильно использовали, АННУЛИРУЕТ, если Ваш запрос не разработан правильно (который обычно является не проблемой, которую Вы будете иметь очень часто относительно ПУСТЫХ УКАЗАТЕЛЕЙ).
необходимо обратить первое внимание на использование базы данных (включая ПУСТЫЕ УКАЗАТЕЛИ), как предназначено; тогда беспокойство о optimizatin последствиях, когда и если они происходят.
кумулятивный эффект неправильно ОБНУЛЕННЫХ значений столбцов и в сложности SQL и в точности почти, конечно, перевесит преимущества играния с Родительским DBMS. Кроме того, это испортит Вашу голову, а также того из любого позже, кто пытается выяснить то, что Вы пытались сделать.
На некоторых базах данных как Oracle, может быть somethinkg на MySQL, верно: