Domyślnie NULL czy NOT NULL?

41

Czy w MySQL lepiej jest zawsze dopuszczać wartości null, chyba że wiesz, że pole jest wymagane, czy zawsze używać, Not Nullchyba że wiesz, że pole będzie zawierać wartości null? Czy to nie ma znaczenia?

Wiem, że w niektórych systemach DBMS mówi się, że używają Not Nulljak najwięcej, ponieważ zezwolenie na wartości null wymaga dodatkowego bitu (lub bajtu?) Na rekord do przechowywania statusu Null.

BenV
źródło
1
Powinieneś zezwolić NULLwtedy i tylko wtedy, gdy NULLwartość ma interpretację rzeczy, którą modelujesz.
jameshfisher

Odpowiedzi:

25

W większości baz danych NOT NULLkolumna będzie bardziej wydajna pod względem przechowywanych danych z podanego powodu, a także bardziej wydajna w wyszukiwaniu i indeksowaniu - więc jeśli nie chcesz zezwalać na wartości NULL w kolumnie, powinieneś je wyraźnie zabronić.

Będzie to miało niewielki wpływ na wydajność, ponieważ dodatkowe NOT NULLograniczenia będą potencjalnie musiały zostać sprawdzone dla każdego wiersza, którego dotyczy zmiana za pomocą dowolnego WSTAWIANIA lub AKTUALIZACJI, ale ponieważ większość baz danych jest względnie lekka w pisaniu i obciążona odczytem, ​​prawdopodobnie nie stanowi to problemu (małe dodatkowy czas nie będzie w ogóle zauważalny, ponieważ jest to operacja związana z procesorem, w której reszta operacji wstawiania / aktualizacji będzie związana z operacjami we / wy, a więc o wiele bardziej znaczącym „wąskim gardłem” i daje ci trochę „darmowego” "sprawdzanie danych, aby Twój kod (lub kod innej osoby) nie mógł przypadkowo umieścić wartości NULL tam, gdzie inny kod ich nie oczekuje, a zatem może dawać nieprawidłowe wyniki w ich obecności.

Edycja: Jak zauważa Peter w swoim komentarzu, powyższy jest generalizmem i może nie dotyczyć wszystkich DMBS, chociaż jestem całkiem pewien, że tak jest w przypadku mysql i mssql. Inne komplikacje w tym obszarze mogą obejmować takie funkcje, jak rzadkie tabele (na przykład zaimplementowane MSSQL 2008), które zmienią dynamikę wydajności (nie) zerowalnych kolumn.

David Spillett
źródło
8
To niekoniecznie jest prawdą w PostgreSQL. Kolumny zerowe oszczędzają miejsce, co może poprawić szybkość, a czas przetwarzania powinien być mniej więcej taki sam.
Peter Eisentraut,
4
Nie dotyczy to również Oracle. Ponadto, w przeciwieństwie do MySql, Oracle nie indeksuje wartości zerowych, dzięki czemu można zmniejszyć ich wielkość za pomocą nich. Zobacz stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel
8

Powinieneś pozwolić projektowi schematu i wymaganiom aplikacji kierować tą decyzją. W większości przypadków różnice w wydajności prawdopodobnie nie są zauważalne.

Peter Eisentraut
źródło
3
Po raz kolejny najlepszym sposobem, aby się upewnić, jest profilowanie i testowanie.
jcolebrand
Byłbym ostrożny z tak szerokimi stwierdzeniami - jeśli piszesz 10 milionów wierszy dziennie do tabeli za pomocą jakiegoś procesu ETL, a ta tabela ma kilka pól ograniczonych wartością Null, zobaczysz wpływ na wydajność.
ScottCher,
1
+1: Może nie jest to prawdą dla wszystkich aplikacji, ale dla tego, co robię, uzyskanie spójnych / poprawnych danych jest ważniejsze niż oszczędność miejsca lub utrata prędkości.
jp.