За замовчуванням NULL або NOT NULL?


41

Чи краще в MySQL завжди дозволяти нулі, якщо ви не знаєте, що це поле потрібно, або завжди використовувати, Not Nullякщо ви не знаєте, що поле буде містити нулі? Або це не має значення?

Я знаю, що в деяких СУБД вони кажуть використовувати Not Nullякомога більше, оскільки для дозволу нулів потрібен додатковий біт (або байт?) На запис, щоб зберігати стан Null.


1
Ви повинні дозволити, NULLякщо і тільки якщо NULLзначення має інтерпретацію для речі, яку ви моделюєте.
jameshfisher

Відповіді:


25

У більшості баз даних NOT NULLстовпець буде більш ефективним щодо збережених даних з причини, яку ви заявляєте, а також більш ефективним для запитів та індексів, тому, якщо ви не хочете дозволити NULLs у ​​стовпці, ви повинні явно заборонити їх.

Буде незначне значення для продуктивності, оскільки додаткові NOT NULLобмеження потенційно потрібно перевірити для кожного рядка, на який ви впливаєте, будь-яким INSERT або UPDATE, але оскільки більшість баз даних є відносно легкими для запису та важкими для читання, це, мабуть, не викликає занепокоєння (мало додатковий час, навряд чи взагалі буде помітний, оскільки це операція, пов'язана з процесором, де решта операцій з вставкою / оновленням буде пов'язана з IO і, таким чином, набагато більш значним вирізом), і це дає вам "безкоштовно "перевірка даних, щоб ваш код (або код інших людей) не міг випадково поставити NULL, якщо інший код їх не очікує, і тому може дати неправильні результати в їх присутності.

Редагувати: Як Петр зазначає у своєму коментарі, вищесказане - це загальний характер і, можливо, не відповідає дійсності для всіх DMBS, хоча я впевнений, що це стосується mysql та mssql. Інші ускладнення в цій області можуть включати такі функції, як розріджені таблиці (як, наприклад, впроваджений MSSQL 2008), які змінять динаміку продуктивності (не) обнулених стовпців.


8
Це не обов'язково вірно в PostgreSQL. Нульові стовпці економлять простір, що може підвищити швидкість, і час обробки повинен бути приблизно однаковим.
Пітер Ейзентраут

4
Це також не стосується Oracle. Крім того, на відміну від MySql, Oracle не індексує нулі, тому ви можете зменшити розмір ваших індексів, використовуючи їх. Дивіться stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel

8

Ви повинні дозволити вашій схемі розробки та вимогам програми керувати цим рішенням. Відмінності в продуктивності, мабуть, не помітні в будь-якому випадку в більшості випадків.


3
Ще раз, найкращий спосіб точно знати - це профілювання та тестування.
jcolebrand

Я був би обережним з такими широкими твердженнями - якщо ви записуєте 10 мільйонів рядків на ніч в таблицю через якийсь процес ETL, і в цій таблиці є купа полів, що не мають нуля, ви побачите наслідки на продуктивність.
ScottCher

1
+1: Можливо, це не так для всіх програм, але для того, що я роблю, отримання послідовних / правильних даних важливіше, ніж економія місця або втрата певної швидкості.
jp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.