it-swarm.com.de

Belegt ein leerer Spaltenwert denselben Speicherplatz wie ein gefüllter Spaltenwert?

Ich habe eine Tabelle mit 2 Spalten. Der Typ beider Spalten ist auf varchar(38) gesetzt. Wenn ich eine Zeile mit einem leeren Wert für eine der Spalten erstelle, benötigt sie denselben Speicherplatz, als wäre der Wert nicht leer?

Mit anderen Worten, wird MySQL Speicherplatz für die Spalte (abhängig von ihrem Typ) reservieren, wenn eine Zeile erstellt wird?

17
Haris ur Rehman

Aus der Innodb Physical Row Structure, Bulletpoint # 7 unter REDUNDANT ROW_FORMAT

Ein SQL NULL-Wert reserviert ein oder zwei Bytes im Datensatzverzeichnis. Außerdem reserviert ein SQL NULL-Wert reserviert null Bytes im Datenteil des Datensatzes, wenn er in einer Spalte variabler Länge gespeichert ist. In einer Spalte mit fester Länge wird die feste Länge der Spalte im Datenteil des Datensatzes reserviert. Durch Reservieren des festen Speicherplatzes für NULL-Werte kann eine Aktualisierung der Spalte von NULL auf einen Nicht-NULL-Wert durchgeführt werden, ohne dass die Indexseite fragmentiert wird.

Aus dem Innodb Physical Row Structure, Bulletpoint # 2 unter COMPACT ROW_FORMAT

Der Teil mit variabler Länge des Datensatzheaders enthält einen Bitvektor zur Angabe von NULL-Spalten. Wenn die Anzahl der Spalten im Index, die NULL sein können, N ist, belegt der Bitvektor CEILING (N/8) Bytes. (Wenn beispielsweise 9 bis 15 Spalten NULL sein können, verwendet der Bitvektor zwei Bytes.) Spalten, die NULL sind, belegen keinen anderen Speicherplatz als die Bit in diesem Vektor. Der Teil des Headers mit variabler Länge enthält auch die Längen von Spalten mit variabler Länge. Jede Länge benötigt ein oder zwei Bytes, abhängig von der maximalen Länge der Spalte. Wenn alle Spalten im Index NICHT NULL sind und eine feste Länge haben, enthält der Datensatzheader keinen Teil variabler Länge.

Basierend auf diesen Aufzählungspunkten wird hier ein NULL -Wert für den Speicher einer Spalte verwendet

  • variable Länge: ein NULL-Wert nimmt keinen Speicherplatz ein in der Zeile selbst
  • feste Länge: Nimmt den reservierten Platz ein

Jetzt müssen Sie sich aufgrund des ersten Punktes zwischen CHAR und VARCHAR entscheiden

Durch Reservieren des festen Speicherplatzes für NULL-Werte kann eine Aktualisierung der Spalte von NULL auf einen Nicht-NULL-Wert durchgeführt werden, ohne dass die Indexseite fragmentiert wird

Auf diese Weise wird verhindert, dass eine Zeile fragmentiert wird, wenn Nicht-NULL-Daten gespeichert werden. Dies ist etwas, das ich zuvor in Bezug auf MyISAM besprochen habe: Siehe meinen alten Beitrag Welche Auswirkungen hat die Verwendung von CHAR vs VARCHAR auf ein Feld mit fester Größe auf die Leistung? .

12
RolandoMySQLDBA

Unabhängig von der Länge, die Sie für Ihre Varchar-Spalte definieren, ist der von einer leeren Spalte verwendete Speicherplatz gleich.

Die Typen CHAR und VARCHAR

(enter image description here

Dies betrifft nur den von der varchar-Spalte verwendeten Speicherplatz und berücksichtigt nicht den gesamten von der Zeile, ihren Indizes, Primärschlüsseln und anderen Spalten verwendeten Speicherplatz.

Wie ypercube in seinem Kommentar erwähnt, gibt es zusätzliche Überlegungen für den gesamten Zeilenspeicher, wenn mindestens eine nullfähige Spalte vorhanden ist.

Innodb Physical Row Structure

Der Teil mit variabler Länge des Datensatzheaders enthält einen Bitvektor zum Anzeigen von NULL-Spalten. Wenn 9 bis 15 Spalten NULL sein können, verwendet der Bitvektor zwei Bytes.)

...

Der Teil des Headers mit variabler Länge enthält auch die Längen von Spalten mit variabler Länge. Jede Länge benötigt ein oder zwei Bytes, abhängig von der maximalen Länge der Spalte. Wenn alle Spalten im Index NICHT NULL sind und eine feste Länge haben, enthält der Datensatzheader keinen Teil variabler Länge

Und ja, der verwendete Speicherplatz ändert sich je nach ausgewähltem Typ, ob fest oder variabel, der Sortierung und anderen Faktoren wie der Engine.

MySQL gibt hier Empfehlungen zur Optimierung der Datenspeicherung: Optimierung der Datengröße

Update

Eine zusätzliche Überlegung mit varchar und das ist Speicher. In MySQL ist es wichtig, die Größe einer Spalte variabler Länge so weit wie möglich zu begrenzen. Obwohl die Spalte variabel und der verwendete Speicherplatz variabel ist, weist MySQL Speicher in festen Blöcken zu, um Werte zu speichern. Zum Beispiel verwendet varchar (200) mehr Speicher als varchar (5). Dies ist kein Speicherplatzproblem, aber dennoch etwas, das Sie beim Definieren Ihrer Spalten berücksichtigen sollten.

8
Craig Efrein