Подтвердить что ты не робот

Когда использовать таблицы NULL в MySQL

Я ценю семантическое значение значения NULL в таблице базы данных, отличное от ложного и пустой строки ''. Тем не менее, я часто читал о проблемах с производительностью, когда поля имеют значение NULL, и было рекомендовано использовать пустую строку в случаях, когда NULL на самом деле семантически корректен.

Какие обстоятельства подходят для использования полей с нулевым значением и значений NULL? Каковы компромиссы? Разве разумно просто избегать использования NULL вообще и просто использовать пустые строки, false или 0, чтобы указать отсутствие значения?

UPDATE

ОК. Я понимаю семантическую разницу между "и" NULL ", а также обстоятельства (агностики производительности), в которых значение NULL является подходящим значением поля. Однако позвольте мне рассказать о намеченной проблеме производительности. Это от превосходной" высокопроизводительной MySQL" Шварца, Zeitsev et al. http://www.borders.co.uk/book/high-performance-mysql-optimization-backups-replication-and-more/857673/:

Для MySQL гораздо труднее оптимизировать запросы, которые относятся к nullable coumns, потому что они делают индексы, индексы статистика и сравнение значений больше сложно. В столбце с нулевым значением используется больше места для хранения и требует специальная обработка внутри MySQL. когда индексируемый столбец с нулевым значением, он требуется дополнительный байт на запись и может даже привести к индексу фиксированного размера (например, индекс одного целого числа столбец) для преобразования в переменный размер в MyISAM.

Подробнее здесь: Предварительный просмотр книг Google

Это, возможно, окончательный ответ - я просто искал второе мнение и опыт на первой линии.

4b9b3361

Ответ 1

Однако, я часто читал о проблемы производительности, когда поля недействительным и рекомендуется использовать пустая строка в случаях, когда NULL фактически семантически корректно.

На какое-то время я собираюсь сделать выбор из-за выбора слова:

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

Ответ 3

Мы не допускаем значения NULL в наших базах данных, если это не относится к числовым значениям или к датам. Причина, по которой мы это делаем, состоит в том, что числовые значения иногда не должны быть дефолтны до нуля, так как это очень, очень плохо. Я разработчик биржевых брокеров, и там большая разница между NULL и 0. Использование COALESCE пригодится, если мы хотим, чтобы значения по умолчанию возвращались к нулю, даже если мы не храним их как таковые.

MyVal = COALESCE(TheData, 0)

Как мы делаем объемные вставки данных из плоских файлов, мы используем файлы формата для определения записи данных, которая в любом случае автоматически преобразует пустые значения в пустые строки.

Даты по умолчанию, независимо от того, какое значение может показаться зависящим от сопоставления, которое я верю, но по умолчанию мы использовали что-то вроде 1900, и снова даты очень важны. Другие значения обычного текста не так важны, и, если оставить их пустыми, как правило, это нормально.

Ответ 4

Как правило, если требуется атрибут, он определяется как Not NULL, и если он может быть опущен, он определяется как nullable.

Ответ 5

Пустую строку не следует использовать вместо NULL. NULL ничего не представляет, поскольку пустая строка - это нечто, внутри которого нет ничего. NULL всегда будет ложным по сравнению с другим значением (даже NULL) и NULL не будет суммироваться в функции COUNT.

Если вам нужно представить неизвестную информацию, заменить ее на NULL нет.

Ответ 6

Как @ForYourOwnGood сказал - Null следует использовать для "неизвестной" информации. Например: Если у вас есть много полей, которые клиент должен заполнить при регистрации, а некоторые из них являются необязательными. По какой-то причине вы можете зарезервировать идентификатор для этого конкретного клиента, и, поскольку вы не знаете, являются ли дополнительные поля реальным выбором для клиента, который останется пустым, вы должны установить их как NULL, то есть "неизвестно", когда вы сначала сохраняете ряд. Если клиент отправляет форму, проходит всю вашу проверку, а затем вы сохраняете эту информацию, то вы знаете, что необязательное поле остается пустым по замыслу.

Это хороший пример использования NULL.

Ответ 7

Главным преимуществом, конечно же, является семантический смысл NULL, о котором вы говорили.

В дополнение к этому - и он может зависеть от вашего механизма хранения, как всегда, проверить документацию - но, по крайней мере, в некоторых базах данных, NULL занимают намного меньше места, чем регулярное значение. Например, если у вас есть столбец "varchar", объявленный как 20 символов, и он редко заполняется, вы можете сэкономить много места на диске, сделав его NULL вместо пустой строки.

Я никогда не слышал о каких-либо проблемах с производительностью при использовании NULL, один наоборот. Я слышал о том, что люди трахают свои счета, потому что считают NULL ошибочными, но никогда не работают. Если это реально, я хотел бы услышать об этом!

Ответ 8

Значение столбца NULL более или менее "не применяется в этом контексте". Обычно я использую столбцы NULL в двух случаях:

  • Если поле не применяется (скажем, у вас булевский столбец is_thirsty, и вы добавляете два набора данных. Один человек и камень. В случае человека вы устанавливаете is_thirsty либо true, либо false, тогда как в случае из камня, вы, вероятно, установили бы его в NULL.
  • Если мне нужно что-то помечать и хранить некоторые данные со значением. Подобно дате закрытия инвентаря, которую вы использовали для a) укажите, что инвентарь больше не может быть изменен, и b) указать, когда инвентарь был закрыт. Вместо двух столбцов (closed_at и is_closed) я просто создаю столбец closed_at и устанавливаю его в NULL, если набор инвентаря все еще можно изменить, но установите дату после его закрытия.

В основном это сводится к тому, что я использую NULL, когда пустота поля имеет другую уникальную семантику, чем просто пустое поле. Это отсутствие среднего начального. Отсутствие даты закрытия означает, что набор инвентаря все еще открыт для изменений.

Значения NULL могут иметь неприятные побочные эффекты, и они значительно усложнят вам возможность добавлять данные в таблицу, а чаще всего, вы можете в конечном итоге получить mish-mash из значений NULL и пустых строк, например.

Кроме того, NULL не равен чему-либо, что приведет к зависанию запросов повсюду, если вы не очень осторожны.

Лично я использую столбцы NULL только в том случае, если применяется один из двух вышеуказанных случаев. Я никогда не использую его для обозначения пустых полей, когда пустота не имеет смысла, кроме отсутствия значения.

Ответ 9

Любой уважающий себя механизм базы данных в эти дни не должен предлагать штраф за правильное использование NULL, если ваш запрос не разработан правильно (что обычно не является проблемой, которую вы будете иметь очень часто в отношении NULL).

Вы должны обратить внимание на использование базы данных (включая NULL), как предполагалось; затем волнуйтесь о последствиях оптимизатина, когда и когда они происходят.

Кумулятивный эффект неправильного значения столбцов NULLed как по сложности SQL, так и по точности почти наверняка перевешивает преимущества обмана с помощью СУБД Mother. Кроме того, это испортит вам голову, как и любой другой, кто попытается выяснить, что вы пытаетесь сделать.

Ответ 10

В некоторых базах данных, таких как Oracle, может быть что-то из MySQL верно:

  • Нули не индексируются, тогда поиск нулевых значений может быть узким местом.
  • Возвращение нулей в строки сэкономит место.