2014-10-02 4 views
0

Я использую MYSQL как базу данных. Проверьте это определение таблицыРазрешить Нулевые значения для индексированного столбца или NOT NULL для индексированного столбца в MYSQL? То, что хорошо?

CREATE TABLE `test`.`header` 
( 
`header_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, 
`title` VARCHAR(500) NOT NULL, 
`body` VARCHAR(5000) NOT NULL, 
`created_by_id_ref` BIGINT UNSIGNED NOT NULL, 
`created_date` DATETIME NOT NULL, 
`updated_date` DATETIME NULL DEFAULT NULL, 
`is_void` TINYINT(1) NULL DEFAULT NULL, 
PRIMARY KEY (header_id`)) ENGINE=INNODB CHARSET=latin1 COLLATE=latin1_swedish_ci; 

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

Я объявил эту колонку этим синтаксисом. что показано выше. Вот это снова.

`is_void` TINYINT(1) NULL DEFAULT NULL, 

Таким образом, если я добавлю индекс в этот столбец, это объявление столбца хорошее? В этом случае значения по умолчанию имеют нулевые значения. Для аннулированных записей это будет «1». Так что, если я буду фильтровать любого из этих записей для аннулированного записей я должен использовать

Select ........ where is_void=1; 

Если я хочу, чтобы фильтровать не аннулированы записи можно использовать

Select ........ where is_void IS NULL; 

Так это объявление NULL влияет на мой выбор производительности запроса? (Помните, я индексироваться этот столбец)

или я объявляю мою колонку, как

`is_void` TINYINT(1) NOT NULL, 

, а затем я должен вставить «0» для не аннулирована записей. Затем, если я хочу фильтровать невооруженные записи, я могу использовать

Select ........ where is_void=0; 

Итак, что лучше? где is_void = 0; или где is_void IS NULL;

спасибо.

+0

Проверьте план выполнения, и вы увидите. –

+0

Я бы пошел с '1' и' 0' вместо '1' и' null' для согласованности, условности и более простой разработки. По-моему, я все еще склоняюсь к «1» и «0». Мне тоже не нравится «null». :) –

+0

Andy Считаете ли вы, что методы 1 и 0 и 1 и NULL являются показателями производительности равными? или разные? – Sylar

ответ

0

С точки зрения характеристик оба подхода эквивалентны *.

С точки зрения логики, NULL широко рассматривается как означающее «неизвестное значение» или «неприменимо». Пойдите с 1 или 0, as defined by the TRUE and FALSE constants.

Кроме того, хотя MySQL реализует его как псевдоним для TINYINT(1), я бы посоветовал использовать ANSI-стандарт BOOLEAN type.


*Хорошо, this is not entirely true в теории.

+0

Спасибо, RandomSeed. Я объявил, что столбец имеет значение null, чтобы сохранить пространство для хранения. Поскольку я читал, что для нулевых значений потребуется только 1 бит для хранения этого состояния NULL, другим значениям требуется больше памяти. В моих таблицах void - это не то, что часто происходит. Поэтому я подумал, что вместо обновления 0 для каждой неизведанной записи почему я не должен обновлять 1 для только аннулированных записей. что вы думаете? – Sylar

+0

Я думаю, что 100 миллионов булевых значений занимают около 100 МБ памяти, и у вас должно быть лучшее, о чем можно подумать. И вам, вероятно, никогда не придется «обновлять каждую неизмененную запись». Вероятно, это будет однократная операция, которая будет возникать при создании столбца. – RandomSeed

Смежные вопросы