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?

War es hilfreich?

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

suchen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top