Вопрос по mysql – MySQL: NULL против «»

40

Это лучше использоватьdefault null или жеdefault "" для текстовых полей в MySQL?

Зачем?

Обновление: я знаю, что означает каждый из них. Мне интересно, что лучше использовать, учитывая дисковое пространство и производительность.

Обновление 2: Эй, чел! Вопрос был в том, что лучше использовать. не «что значит каждый» или "как их проверить" ...

хаха, я люблю обновления комментариев Xeoncross
Как и в большинстве случаев "что лучше для дискового пространства и производительности"? вопросы: почему бы вам просто не вставить миллион строк с помощью NULL, протестировать некоторые запросы и проверить место на диске? Повторите с "s", и еще раз с относительно равномерным смешением. И ответ гораздо надежнее, чем то, что говорит какой-то случайный парень из SO;) ojrac

Ваш Ответ

12   ответов
7

null а также'', но ОП запросил, что занимает меньше места / быстрее, так что вот мое замечание:

Ответ в том, что это зависит. Если ваше полеchar(10), он всегда будет занимать 10 байт, если не установлен вnull, и поэтому,null займет меньше места. Минуты построчно, но для миллионов и миллионов строк это может сложиться. Я верю дажеvarchar(10) будет хранить один байт (\0) как пустая строка, так что опять это может сложиться над огромными таблицами.

С точки зрения производительности в запросах,null Теоретически это быстрее для тестирования, но я не видел ни одного заметного различия в хорошо проиндексированной таблице. Имейте в виду, однако, что вам, возможно, придется преобразоватьnull в'' на стороне приложения, если это желаемое возвращение. Опять же, строка за строкой, разница невелика, но потенциально она может накапливаться.

В целом, это микрооптимизация, поэтому все сводится к предпочтениям. Я предпочитаю использоватьnull потому что мне нравится знать, что там нет никакого значения, и не догадываться, является ли это пустой строкой ('') или куча пробелов (' '). null явно по своей природе.'' не является. Поэтому я иду сnull потому что я явный парень.

3

NULL означает «значение не доступно / не указано»,"" означает «пустая строка».

Если вы не разрешаете пустые строки, но пользователю не нужно вводить значение, тогдаNULL имеет смысл. Если вам требуется значение, но оно может быть пустым,NOT NULL и значение"" имеет смысл.

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

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

Дело в том, что у меня будут миллионы записей Ion Br.
Я хотел бы, чтобы оракул понял это :)
Я не ожидаю какой-либо существенной разницы в объеме дискового пространства или производительности.
+1 Согласен, NULL имеет смысловой смысл в зависимости от предметной области
@JohnZ: см. Мой обновленный текст. Не беспокойтесь, если у вас нет ОГРОМНОГО количества данных, и даже тогда,NULL/NOT NULL мало что меняет
0

& quot ;. Это требует меньше усилий для программирования, если вы можете утверждать, что столбцы не равны NULL. Разница в пространстве между ними тривиальна.

1

когда это семантически правильно. Если доступно поле адреса, а пользователь не заполнил, я даю ему & quot; ". Тем не менее, если в атрибуте address в таблице users я еще не предложил пользователю заполнить его, я даю ему NULL.

Я сомневаюсь (но я не могу проверить), что NULL и "quot;" имеет большое значение.

52

NULLABLE (нулевой бит) для каждой строки. Если столбец не NULLABLE, дополнительный бит информации никогда не требуется. Однако это дополняется до 8 битных байтов, поэтому вы всегда получаете 1 + мод 8 байтов для количества столбцов NULLABLE.1

Текстовые столбцы немного отличаются от других типов данных. Во-первых, для & quot; & quot; запись таблицы содержит длину строки в два байта, за которой следуют байты строки, и является структурой длины варианта. В случае NULL нет необходимости в информации о длине, но она в любом случае включена как часть структуры столбца.

В InnoDB NULLS не занимают места: они просто не существуют в наборе данных. То же самое верно для пустой строки, так как смещения данных также не существует. Единственное отличие состоит в том, что в NULL будет установлен бит NULL, в то время как пустые строки не получатся.2

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

В результате NULL и '' ' пространственные различия,NULL а также'' НЕ ВЛИЯНИЕ НА РАЗМЕР, если столбец не указан как NULLable или нет. Если столбец НЕ ПУСТО (NULL), то только в таблицах MyISAM вы увидите разницу в производительности (и тогда, очевидно, значение по умолчанию NULL не может быть использовано, так что это спорный вопрос).

Тогда реальный вопрос сводится к интерпретации приложения «здесь не задано значение». колонны. Если & quot; & quot; является допустимым значением, означающим "пользователь здесь ничего не вводил" или что-то подобное, тогда предпочтительным будет значение NULL по умолчанию, поскольку вы хотите различать NULL и & quot; & quot; когда вводится запись, в которой нет данных.

В целом, по умолчанию, действительно полезно только для рефакторинга базы данных, когда новые значения должны вступить в силу для старых данных. В этом случае, опять же, выбор зависит от того, как интерпретируются данные приложения. Для некоторых старых данных NULL идеально подходит и лучше всего подходит (столбец раньше не существовал, поэтому теперь он имеет значение NULL!). Для других & quot; & quot; является более подходящим (часто, когда запросы используют SELECT *, а NULL вызывает проблемы сбоев).

В ULTRA-GENERAL TERMS (и с философской точки зрения) значение NULL по умолчанию для столбцов NULLABLE является предпочтительным, так как оно дает наилучшую семантическую интерпретацию «Не указано значение».

1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]

2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]

0

"" это как пустая коробка ...null это как не коробка вообще.

Это сложная концепция для понимания на начальном этапе, но, как ясно дают ответы здесь, есть большая разница.

0

и рассматривается особенно СУБД относительно того, где оговорки и присоединения.

& Quot; & Quot; означает «пустая строка» и не лечится особо.

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

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

Declined optional questions should have a NULL in their corresponding column. Obligatory questions should have an empty string as default, because they HAVE to be answered. (Of course in a real application you'd tell the user to enter something, but I hope you get the idea)
0

'' = '' доходностьTRUE который удовлетворяетWHERE состояние

NULL = NULL доходностьNULL который не удовлетворяетWHERE состояние

Что лучше использовать, зависит от того, какой результат вы хотите получить.

Если ваши значения по умолчаниюNULL, нет запроса, как это:

SELECT  *
FROM    mytable
WHERE   col1 = ?

будет возвращать эти значения, даже если вы передадитеNULL для связанного параметра, в то время как этот запрос:

SELECT  *
FROM    mytable
WHERE   col1 = ''

вернет вам строки, которые вы установили в пустую строку.

Это верно дляMySQL, но не дляOracle, который не различает пустую строку иNULL.

ВOracleпоследний запрос никогда не вернет ничего.

0

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

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

21

Высокая производительность MySQL, 3-е издание

Avoid NULL if possible. A lot of tables include nullable columns even when the application does not need to store NULL (the absence of a value), merely because it’s the default. It’s usually best to specify columns as NOT NULL unless you intend to store NULL in them. It’s harder for MySQL to optimize queries that refer to nullable columns, because they make indexes, index statistics, and value comparisons more complicated. A nullable column uses more storage space and requires special processing inside MySQL. When a nullable column is indexed, it requires an extra byte per entry and can even cause a fixed-size index (such as an index on a single integer column) to be converted to a variable-sized one in MyISAM. The performance improvement from changing NULL columns to NOT NULL is usually small, so don’t make it a priority to find and change them on an existing schema unless you know they are causing problems. However, if you’re planning to index columns, avoid making them nullable if possible. There are exceptions, of course. For example, it’s worth mentioning that InnoDB stores NULL with a single bit, so it can be pretty space-efficient for sparsely populated data. This doesn’t apply to MyISAM, though.

& GT; Улучшение производительности от замены столбцов NULL на NOT NULL обычно невелико
Преобразует ли все пустые значения в строковом столбце в пустые строки и делает столбец NOT NULLactually улучшить производительность в какой-либо измеримой степени? Мысль о том, что следует избегать пустых столбцов по соображениям производительности, является той, которую я никогда не слышал до сих пор, и я сразу подозреваю ее.
Точные цифры, я думаю, будут очень зависеть от вашего движка, типа столбца, размера столбца / индекса, количества строк и т. Д. Поэтому вам не следует заботиться об этом, пока у вас не возникнет реальная проблема производительности при запросе какого-либо столбца.
10

& quot; незначительно с точки зрения дискового пространства и производительности.

Единственную истинную причину, которую я лично вижу в использовании NULL над & apos; когда у вас есть поле, помеченное какUNIQUE но нужна возможность разрешить множественное «пустое» колонны.

Например,email Столбец в моей пользовательской таблице заполняется только в том случае, если у кого-то есть адрес электронной почты. Любой, у кого нет адреса электронной почты, получает NULL. Я все еще могу сделать это поле уникальным, потому что значение NULL не считается значением, тогда как пустая строка "" является.

39

null, В SQLnull сильно отличается от пустой строки (& quot; & quot;). Пустая строка конкретно означает, что значение было установлено как пустое;null означает, что значение не было установлено или было установлено на ноль. Видите ли, разные значения

Разные значения и их различное использование - вот почему важно использовать каждый из них по мере необходимости; количество места, потенциально сэкономленного с помощьюdefault null в отличие отdefault "" настолько мал, что приближается к незначительности; однако потенциальная ценность использования надлежащих значений по умолчанию, как того требует соглашение, довольно высока.

@borjab: спасибо за понимание?
В Oracle '' НУЛЕВОЙ
В MySQL, о котором говорит OP, руководство рекомендует столбцы NOT NULL. & quot; Объявлять столбцы как NOT NULL, если это возможно. Это ускоряет операции SQL, позволяя лучше использовать индексы и устраняя накладные расходы на проверку того, является ли каждое значение NULL. Вы также экономите место для хранения, один бит на столбец. & Quot;dev.mysql.com/doc/refman/5.5/en/data-size.html
Ссылаться наstackoverflow.com/questions/1034925/… , который имеет некоторые отличные дискуссии по этому вопросу.
Да, таким образом, вы можете рассматривать НЕТ ЗНАЧЕНИЯ иначе, чем возможное действительное "пустое значение"

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