Когда использовать ПУСТОЙ УКАЗАТЕЛЬ в таблицах MySQL

48
задан Bill Karwin 12 March 2018 в 02:20
поделиться

9 ответов

Однако я часто читал о проблемах производительности, когда поля nullable и рекомендуемый использовать пустую строку в случаях, где ПУСТОЙ УКАЗАТЕЛЬ на самом деле семантически корректен.

я собираюсь быть придирчивым в отношении гниды в отношении выбора слова на мгновение:

  • , Даже если это был значительный показатель производительности, который не делает его семантически корректным для использования значения вместо ПУСТОГО УКАЗАТЕЛЯ. В SQL ПУСТОЙ УКАЗАТЕЛЬ имеет семантическую роль, для обозначения отсутствия или неподходящего значения. Рабочие характеристики ПУСТОГО УКАЗАТЕЛЯ в данной реализации RDBMS независимы от этого. Производительность может варьироваться от бренда до бренда или от версии до версии, но цель ПУСТОГО УКАЗАТЕЛЯ на языке последовательна.

В любом случае, я не услышал ни о каком доказательстве, что ПУСТОЙ УКАЗАТЕЛЬ работает плохо. Я интересовался бы любыми ссылками на измерения производительности, которые показывают, что 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), что преимущество индекса омрачает любой возможный штраф при поиске ПУСТОГО УКАЗАТЕЛЯ по сравнению с пустой строкой.

Это не корректное проектное решение выбрать нуль или пробел или любое другое значение для заменения ПУСТОЙ УКАЗАТЕЛЬ. Вы, возможно, должны использовать те значения в качестве значительных в столбце. Вот почему ПУСТОЙ УКАЗАТЕЛЬ существует как значение, которое является по определению вне домена значений любого типа данных, таким образом, можно использовать полный спектр значений целых чисел или строк или безотносительно и все еще иметь что-то для выражения "ни одного из вышеупомянутых значений".

37
ответ дан Bill Karwin 26 November 2019 в 19:00
поделиться

Руководство MySQL на самом деле имеет хорошую статью [приблизительно 110] проблемы с ПУСТЫМ УКАЗАТЕЛЕМ.

Hope это помогает.

Также нашел это другим ТАК сообщение о ПУСТОМ УКАЗАТЕЛЕ и Производительности

11
ответ дан Community 26 November 2019 в 19:00
поделиться

Мы не позволяем Нулевые значения в наших базах данных, если это не для числовых значений, или для дат. Причина, почему мы делаем это, состоит в том, потому что числовые значения иногда не должны приниматься значение по умолчанию для обнуления, как это очень, очень плохо. Я - разработчик для биржевые маклеры и существует большая, большая разница между ПУСТОЙ УКАЗАТЕЛЬ и 0 . Использование ОБЪЕДИНЯЕТ, пригождается, если мы действительно хотим к значениям по умолчанию назад обнулить даже при том, что мы не храним их как таковой.

MyVal = COALESCE(TheData, 0)

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

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

5
ответ дан Kezzer 26 November 2019 в 19:00
поделиться

Обычно, если атрибут требуется, он определяется как Не ПУСТОЙ и если он может быть опущен, он определяется как nullable.

3
ответ дан Jim Anderson 26 November 2019 в 19:00
поделиться

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

, Если необходимо представить неизвестную информацию, нет никакой замены к NULL.

2
ответ дан reformed 26 November 2019 в 19:00
поделиться

Основное преимущество, конечно, является семантическим значением ПУСТОГО УКАЗАТЕЛЯ, который Вы упомянули.

В дополнение к тому - и это может зависеть от Вашего механизма устройства хранения данных, как всегда, проверить документацию - но в, по крайней мере, некоторых базах данных, АННУЛИРУЕТ, поднимают намного меньше комнаты, чем регулярное значение. Например, если Вам объявили, что "varchar" столбец 20 символов, и это редко заполнено в, можно сохранить большое дисковое пространство путем создания его ПУСТЫМ вместо пустой строки.

я никогда не слышал ни о каких проблемах производительности с использованием, АННУЛИРУЕТ, один противоположное. Я услышал о людях, пачкающих их количества, потому что они рассчитали, АННУЛИРУЕТ неправильно, но никогда производительность. Если это - реальная вещь, я хотел бы услышать об этом!

1
ответ дан SquareCog 26 November 2019 в 19:00
поделиться

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

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

В основном это сводится к тому, что я использую ПУСТОЙ УКАЗАТЕЛЬ, когда пустое из поля имеет различное уникальное семантическое, чем просто пустое поле. Отсутствие средней начальной буквы - просто это. Отсутствие даты закрытия имеет значение набора материально-технических ресурсов, все еще являющегося открытым для изменений.

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

кроме того, ПУСТОЙ УКАЗАТЕЛЬ не равен ничему, которое завинтит запросы повсеместно, если Вы не будете очень осторожны.

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

1
ответ дан pilif 26 November 2019 в 19:00
поделиться

Любой обладающий чувством собственного достоинства механизм базы данных в эти дни не должен предлагать штраф за то, что правильно использовали, АННУЛИРУЕТ, если Ваш запрос не разработан правильно (который обычно является не проблемой, которую Вы будете иметь очень часто относительно ПУСТЫХ УКАЗАТЕЛЕЙ).

необходимо обратить первое внимание на использование базы данных (включая ПУСТЫЕ УКАЗАТЕЛИ), как предназначено; тогда беспокойство о optimizatin последствиях, когда и если они происходят.

кумулятивный эффект неправильно ОБНУЛЕННЫХ значений столбцов и в сложности SQL и в точности почти, конечно, перевесит преимущества играния с Родительским DBMS. Кроме того, это испортит Вашу голову, а также того из любого позже, кто пытается выяснить то, что Вы пытались сделать.

0
ответ дан dkretz 26 November 2019 в 19:00
поделиться

На некоторых базах данных как Oracle, может быть somethinkg на MySQL, верно:

  • Пустые указатели не индексируются, тогда если поиск нулевых значений может быть узким местом.
  • Запаздывание аннулирует на строках, оставляют свободное место.
0
ответ дан FerranB 26 November 2019 в 19:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: