Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:NULL vs

Bei MyISAM-Tabellen erstellt NULL ein zusätzliches Bit für jede NULLABLE-Spalte (das Null-Bit) für jede Zeile. Wenn die Spalte nicht NULLABLE ist, wird das zusätzliche Informationsbit nie benötigt. Dies wird jedoch auf 8-Bit-Bytes aufgefüllt, sodass Sie immer 1 + mod 8 Bytes für die Anzahl der NULLABLE-Spalten gewinnen. 1

Textspalten unterscheiden sich ein wenig von anderen Datentypen. Erstens enthält der Tabelleneintrag für "" die Zwei-Byte-Länge der Zeichenfolge, gefolgt von den Bytes der Zeichenfolge, und ist eine abweichende Längenstruktur. Im Fall von NULL ist die Längenangabe nicht erforderlich, aber sie ist trotzdem Teil der Spaltenstruktur.

In InnoDB nehmen NULLEN keinen Platz ein:Sie existieren einfach nicht im Datensatz. Dasselbe gilt für den leeren String, da die Daten-Offsets ebenfalls nicht existieren. Der einzige Unterschied besteht darin, dass bei NULLen das NULL-Bit gesetzt ist, bei leeren Zeichenfolgen jedoch nicht. 2

Wenn die Daten tatsächlich auf der Festplatte angeordnet sind, belegen NULL und '' in beiden Datentypen GENAU DEN GLEICHEN PLATZ. Wenn der Wert jedoch gesucht wird, ist die Überprüfung auf NULL etwas schneller als die Überprüfung auf '', da Sie die Datenlänge in Ihren Berechnungen nicht berücksichtigen müssen:Sie überprüfen nur das Null-Bit.

Als Ergebnis der Leerzeichenunterschiede NULL und '' NULL und '' haben KEINE SIZE-AUSWIRKUNG, es sei denn, die Spalte ist NULL-fähig oder nicht. Wenn die Spalte NICHT NULL ist, werden Sie nur in MyISAM-Tabellen Leistungsunterschiede sehen (und dann kann natürlich der Standardwert NULL nicht verwendet werden, also ist es eine strittige Frage).

Die eigentliche Frage läuft dann auf die Anwendungsinterpretation der Spalten „hier kein Wert gesetzt“ hinaus. Wenn "" ein gültiger Wert ist, der bedeutet "der Benutzer hat hier nichts eingegeben" oder so ähnlich, dann ist der Standardwert NULL vorzuziehen, da Sie zwischen NULL und "" unterscheiden möchten, wenn ein Datensatz eingegeben wird, der keine Daten enthält.

Im Allgemeinen ist default jedoch nur für das Refactoring einer Datenbank sinnvoll, wenn neue Werte für alte Daten wirksam werden müssen. Auch in diesem Fall hängt die Wahl davon ab, wie die Anwendungsdaten interpretiert werden. Für einige alte Daten ist NULL perfekt geeignet und passt am besten (die Spalte existierte vorher nicht, also hat sie jetzt einen NULL-Wert!). Für andere ist "" besser geeignet (häufig, wenn die Abfragen SELECT * verwenden und NULL Absturzprobleme verursacht).

In ULTRA-ALLGEMEINEN BEGRIFFEN (und aus philosophischer Sicht) wird der Standardwert NULL für NULLABLE-Spalten bevorzugt, da er die beste semantische Interpretation von „Kein Wert angegeben“ liefert.

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

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