Ein dynamisches Speicherformat wird verwendet, wenn eine
MyISAM
-Tabelle Spalten variabler Länge
enthält (VARCHAR
-,
VARBINARY
-, BLOB
- oder
TEXT
-Spalten), oder wenn die Tabelle mit
der Tabellenoption ROW_FORMAT=DYNAMIC
angelegt wurde.
Das dynamische Format ist ein wenig komplizierter als das statische, da jede Zeile einen Header mit einer Längenangabe besitzt. Eine Zeile kann fragmentiert (an nicht-benachbarten Orten gespeichert) werden, wenn sie aufgrund eines Updates länger wird.
Mit OPTIMIZE TABLE
oder myisamchk
-r lassen sich Tabellen defragmentieren. Wenn in
einer Tabelle, die auch Spalten variabler Länge besitzt,
Spalten mit festgelegter Länge vorliegen, die oft
angesprochen oder geändert werden, so empfiehlt es sich, die
Spalten mit variabler Länge in andere Tabellen auszulagern,
um Fragmentierung zu verhindern.
Kennzeichen von dynamischen Tabellen:
Alle String-Spalten sind dynamisch, außer jenen, deren Länge weniger als vier beträgt.
Vor jeder Zeile steht eine Bitmap, die für String-Spalten
angibt, welche Spalten den leeren String enthalten, und
für numerische Spalten, welche Spalten den Wert null
enthalten. Beachten Sie, dass dies keine Spalten mit
NULL
-Werten einbezieht. Wenn eine
String-Spalte nach dem Entfernen angehängter Leerzeichen
die Länge null hat oder eine numerischen Spalte den Wert
Null hat, wird sie in der Bitmap markiert und nicht auf
der Festplatte gespeichert. Nicht-leere Strings werden mit
einem Längen-Byte plus dem String-Inhalt gespeichert.
Sie benötigen normalerweise weniger Festplattenplatz als Festlängen-Tabellen.
Jede Zeile belegt nur so viel Platz wie nötig. Doch wenn
eine Zeile wächst, wird sie aufgespalten, was zu
Fragmentierung führt. Wenn Sie zum Beispiel eine Zeile
mit Daten aktualisieren, die ihre Länge anwachsen lassen,
so wird sie fragmentiert. In diesem Fall kann es
erforderlich sein, gelegentlich OPTIMIZE
TABLE
oder myisamchk -r
auszuführen, um die Leistung zu verbessern.
myisamchk -ei kann Ihnen Statistikdaten
zu Ihrer Tabelle liefern.
Sie sind nach einem Absturz schwerer zu rekonstruieren als Tabellen fester Länge, da die Zeilen unter Umständen in viele Stücke fragmentiert sind und Links (Fragmente) verlorengegangen sein könnten.
Die erwartete Zeilenlänge für dynamische Zeilen wird mit folgendem Ausdruck berechnet:
3 + (number of columns
+ 7) / 8 + (number of char columns
) + (packed size of numeric columns
) + (length of strings
) + (number of NULL columns
+ 7) / 8
Für jeden Link kommen 6 Bytes hinzu. Eine dynamische
Zeile wird immer dann verknüpft (verlinkt), wenn ein
Update sie verlängert. Da jeder neue Link mindestens 20
Bytes hat, passt die nächste Verlängerung wahrscheinlich
noch in denselben Link mit hinein. Wenn nicht, wird ein
neuer Link angelegt. Die Anzahl der Links lässt sich mit
myisamchk -ed feststellen. Alle Links
können mit OPTIMIZE TABLE
oder
myisamchk -r entfernt werden.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.