NULL in MySQL (Performance & Storage)
Frage
Was genau null macht Leistung und Speicher (Raum) weise in MySQL?
Zum Beispiel:
TINYINT: 1 Byte TINYINT w / NULL 1 Byte + irgendwie speichert NULL?
Lösung
Es hängt davon ab, welche Speicher-Engine Sie verwenden.
In MyISAM-Format, wobei jeder Zeilenkopf enthält ein Bitfeld mit einem Bit für jede Spalte NULL-Zustand zu codieren. Eine Spalte, die NULL ist immer noch Raum einnimmt, so NULL ist nicht reduzieren Lagerung. Siehe https://dev.mysql.com/doc/internals/en/ myisam-introduction.html
in InnoDB, jede Spalte einen „Feld Start offset“ in dem Zeilenkopf, der ein oder zwei Bytes pro Spalte. Das hohe Bit in diesem Feld Start-Offset auf, wenn die Spalte NULL. In diesem Fall wird die Spalte nicht gespeichert werden müssen. Also, wenn Sie eine Menge von NULL Ihr Speicher soll deutlich reduziert werden. Siehe https://dev.mysql.com/doc/internals/ de / innodb-Feld-contents.html
EDIT:
Der NULL-Bits Teil der Zeilenköpfe ist, wählt man nicht, um sie hinzuzufügen.
Der einzige Weg, kann ich mich vorstellen NULLs Leistung zu verbessern, ist, dass eine Seite von Daten in InnoDB, kann mehrere Zeilen passen, wenn die Zeilen NULLs enthalten. So Ihre InnoDB Puffer können effektiver sein.
Aber ich wäre sehr überrascht, wenn dies einen erheblichen Leistungsvorteil in der Praxis zur Verfügung stellt. Sich Gedanken über die Wirkung NULLs auf die Leistung ist im Bereich der Mikro-Optimierung. Sie sollten Ihre Aufmerksamkeit an anderer Stelle, in Bereiche konzentrieren, die für den Dollar mehr Knall geben. Zum Beispiel das Hinzufügen gut gewählten Indizes oder Datenbank-Cache Zuordnung zu erhöhen.
Andere Tipps
Bills Antwort ist gut, aber ein bisschen veraltet. Die Verwendung von einem oder zwei Bytes für die Speicherung NULL gilt nur zu InnoDB REDUNDANT Zeilenformat. Seit MySQL 5.0.3 InnoDB verwendet COMPACT Zeilenformat, das nur ein Bit verwendet ein NULL zu speichern (natürlich ein Byte ist das Minimum), also:
Platzbedarf zum NULLs = Decken (N / 8) Bytes , wobei N die Anzahl von NULL Spalten in einer Zeile.
- 0 NULLS = 0 Byte
- 1 bis 8 NULLS = 1 Byte
- 9 bis 16 NULLS = 2 Bytes
- 17-24 NULLS = 3 Bytes
- etc ...
Nach der offiziellen MySQL-Website über COMPACT vs REDUNDANTE:
Das kompakte Zeilenformat nimmt Raum Zeilenspeicher um etwa 20% auf Kosten der für einige Operationen CPU Nutzung zu erhöhen. Wenn die Auslastung ein typisches ist, die von Cache-Trefferraten und Plattengeschwindigkeit begrenzt ist, kompaktes Format ist wahrscheinlich schneller sein.
Vorteil von NULLS über leere Strings oder Zeros mit:
- 1 NULL erfordert 1 Byte
- 1 Leerer String benötigt 1 Byte (unter der Annahme VARCHAR)
- 1 Null erfordert 4 Byte (unter der Annahme, INT)
Sie beginnen die Einsparungen zu sehen hier:
- 8 NULLs erfordern 1 Byte
- 8 Empty Strings erfordert 8 Bytes
- 8 Zeros benötigen 32 Bytes
Auf der anderen Seite, ich schlage vor, mit NULL-Werten über leere Strings oder Nullen, weil sie besser organisiert ist, tragbar und benötigt weniger Platz. Um die Leistung zu verbessern und Platz sparen, konzentrieren sich die richtigen Datentypen zur Verwendung von Indizes und Abfragen statt seltsamen Tricks.
Mehr zu: https://dev.mysql.com/doc/refman /5.7/en/innodb-physical-record.html
Ich würde mit Bill Karwin zustimmen, obwohl ich
dev.mysql.com/doc/refman/ 5.0 / de / is-null-optimization.html MySQL kann die gleiche Optimierung auf col_name ausführen IS NULL, dass es für col_name = constant_value verwenden können. Zum Beispiel kann MySQL Indizes verwenden und reicht für NULL IS NULL