Standardmäßig NULL oder NOT NULL?

41

Ist es in MySQL besser, immer Nullen zuzulassen, wenn Sie nicht wissen, dass ein Feld erforderlich ist, oder immer zu verwenden, Not Nullwenn Sie nicht wissen, dass ein Feld Nullen enthält? Oder spielt es keine Rolle?

Ich weiß, dass in einigen Not NullDBMSs so viel wie möglich verwendet wird, da für das Zulassen von Nullen ein zusätzliches Bit (oder Byte?) Pro Datensatz erforderlich ist, um den Nullstatus zu speichern.

BenV
quelle
1
Sie sollten NULLgenau dann zulassen, wenn der NULLWert eine Interpretation für das Objekt hat, das Sie modellieren.
Jameshfisher

Antworten:

25

In den meisten DBs ist eine NOT NULLSpalte in Bezug auf gespeicherte Daten aus dem angegebenen Grund effizienter und auch effizienter abzufragen und zu indizieren. Wenn Sie also NULL-Werte in einer Spalte zulassen möchten, sollten Sie sie ausdrücklich nicht zulassen.

Es wird eine leichte Auswirkung auf die Leistung geben, da die zusätzlichen NOT NULLEinschränkungen möglicherweise für jede Zeile überprüft werden müssen, die Sie mit INSERT oder UPDATE beeinflussen. Da die meisten Datenbanken jedoch relativ schreib- und leselastig sind, ist dies wahrscheinlich kein Problem (das Wenige) Es ist unwahrscheinlich, dass die in Anspruch genommene zusätzliche Zeit überhaupt bemerkt wird, da es sich um eine CPU-gebundene Operation handelt, bei der der Rest der Einfüge- / Aktualisierungsoperation IO-gebunden ist und somit einen viel bedeutenderen Flaschenhals darstellt msgstr "Datenüberprüfung, damit Ihr Code (oder der Code anderer Personen) nicht versehentlich NULL setzen kann, wenn sie von einem anderen Code nicht erwartet werden, und so möglicherweise falsche Ergebnisse bei deren Vorhandensein liefern.

Edit: Wie Peter in seinem Kommentar hervorhebt, handelt es sich bei den obigen Ausführungen um einen Generalismus, der möglicherweise nicht für alle DMBSs gilt, obwohl ich mir ziemlich sicher bin, dass dies für mysql und mssql gilt. Andere Komplikationen in diesem Bereich können Features wie Sparse-Tabellen (wie sie beispielsweise in MSSQL 2008 implementiert sind) sein, die die Leistungsdynamik von (nicht) nullwertfähigen Spalten verändern.

David Spillett
quelle
8
Dies gilt nicht unbedingt für PostgreSQL. Nullspalten sparen Platz, was die Geschwindigkeit verbessern kann, und die Verarbeitungszeit sollte ungefähr gleich sein.
Peter Eisentraut
4
Dies gilt auch nicht für Oracle. Darüber hinaus indiziert Oracle im Gegensatz zu MySQL keine Nullen, sodass Sie die Größe Ihrer Indizes mithilfe dieser verringern können. Siehe stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel
8

Sie sollten sich bei dieser Entscheidung von Ihrem Schemaentwurf und den Anwendungsanforderungen leiten lassen. Die Leistungsunterschiede sind in den meisten Fällen wahrscheinlich in keiner Weise erkennbar.

Peter Eisentraut
quelle
3
Der beste Weg, dies sicher zu wissen, ist das Erstellen von Profilen und Testen.
Jcolebrand
Ich würde mit solch umfassenden Aussagen vorsichtig sein - wenn Sie 10 Millionen Zeilen pro Nacht über einen ETL-Prozess in eine Tabelle schreiben und diese Tabelle eine Reihe von Feldern mit Nicht-Null-Einschränkung enthält, werden Sie die Auswirkungen auf die Leistung bemerken.
ScottCher
1
+1: Möglicherweise trifft dies nicht für alle Anwendungen zu, aber für das, was ich tue, ist es wichtiger, konsistente / korrekte Daten zu erhalten, als Platz zu sparen oder etwas Geschwindigkeit zu verlieren.
jp