:: DEVELOPER ZONE
myisampack wird benutzt, um MyISAM-Tabellen zu komprimieren.
pack_isam wird benutzt, um ISAM-Tabellen zu komprimieren. Weil
ISAM-Tabellen veraltet sind, wird hier nur myisampack erörtert, aber
alles, was auf myisampack zutrifft, gilt auch für pack_isam.
myisampack funktioniert, indem jede Spalte in der Tabelle separat
komprimiert wird. Die Informationen, die benötigt werden, um Spalten zu
dekomprimieren, werden in den Arbeitsspeicher gelesen, wenn die Tabelle
geöffnet wird. Das ergibt viel bessere Performance beim Zugriff auf
einzelne Datensätze, denn man muss nur exakt einen Datensatz
dekomprimieren, nicht einen viel größeren Block, wie das zum Beispiel bei
der Benutzung von Stacker auf MS-DOS nötig ist. Üblicherweise komprimiert
myisampack die Daten-Datei auf 40%-70%.
MySQL benutzt Speicher-Mapping (mmap()) auf komprimierte Tabellen
und geht zu normalen Lesen / Schreiben von Dateien zurück, wenn
mmap() nicht funktioniert.
Für myisampack gibt es momentan zwei Einschränkungen:
Nach dem Komprimieren ist die Tabelle nur-lesbar.
myisampack kann auch BLOB- oder TEXT-Spalten
komprimieren. Das ältere pack_isam konnte das nicht.
Die Behebung dieser Einschränkungen steht mit niedrigen Priorität auf unserer TODO-Liste.
myisampack wird wie folgt aufgerufen:
shell> myisampack [options] Dateiname ...
Jeder Dateiname sollte der Name einer Index-(.MYI)-Datei sein. Wenn
Sie nicht im Datenbank-Verzeichnis sind, müssen Sie den Pfadnamen zur Datei
angeben. Die .MYI Erweiterung kann weggelassen werden.
myisampack unterstützt folgende Optionen:
-b, --backup
Stellt eine Datensicherung der Tabelle als tabelle.OLD her.
-#, --debug=debug_options
Debug-Log ausgeben. Die debug_options-Zeichenkette ist häufig
'd:t:o,filename'.
-f, --force
Erzwingt die Komprimierung der Tabelle, selbst wenn sie dadurch größer
wird oder die temporäre Datei existiert. myisampack erzeugt eine
temporäre Datei namens tabelle.TMD, während es die Tabelle
komprimiert. Wenn Sie myisampack killen, kann es sein, dass die
.TMD-Datei nicht gelöscht wird. Normalerweise wird myisampack
mit einer Fehlermeldung beendet, wenn es eine existierende
tabelle.TMD-Datei findet. Mit --force packt myisampack
die Tabelle trotzdem.
-?, --help
Hilfetext ausgeben und beenden.
-j große_tabelle, --join=große_tabelle
Verbindet alle Tabellen, die auf der Kommandozeile angegeben wurden, in
eine einzige große Tabelle große_tabelle. Alle Tabellen, die
kombiniert werden sollen, MÜSSEN identisch sein (dieselben Spaltennamen und
-typen, dieselben Indexe usw.).
-p #, --packlength=#
Legt die Speichergröße der Datensatzlänge in Bytes fest. Der Wert sollte
1, 2 oder 3 sein. (myisampack speichert alle Zeilen mit
Längenzeigern von 1, 2, oder 3 Bytes. In den meisten Fällen kann
myisampack den richtigen Längenwert festlegen, bevor es anfängt, die
Datei zu komprimieren. Während des Komprimierungsprozesses stellt es aber
eventuell fest, dass es eine kürzere Länge hätte nehmen können. In diesem
Fall gibt myisampack einen Hinweis aus, dass Sie beim nächsten Mal,
wenn Sie dieselbe Datei packen, eine kürzere Datensatzlänge nehmen
sollten.)
-s, --silent
Schweigsamer Modus. Ausgaben erfolgen nur, wenn Fehler auftreten.
-t, --test
Tabelle nicht tatsächlich komprimieren, sondern nur testweise packen.
-T dir_name, --tmp_dir=dir_name
Das genannte Verzeichnis als Speicherort der temporären Tabelle benutzen.
-v, --verbose
Geschwätziger Modus. Informationen über den Fortschritt und das Komprimierungsergebnis ausgeben.
-V, --version
Versionsinformationen ausgeben und beenden.
-w, --wait
Warten und noch einmal versuchen, wenn die Tabelle in Benutzung ist. Wenn
der mysqld-Server mit der --skip-locking-Option aufgerufen
wurde, ist es keine gute Idee, myisampack aufzurufen, wenn die
Tabelle während des Komprimierungsprozesses möglicherweise aktualisiert
wird.
Die unten stehende Befehlssequenz zeigt eine typische Tabellen-Komprimierungssitzung:
shell> ls -l station.* -rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.MYD -rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.MYI -rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm shell> myisamchk -dvv station MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-02-02 3:06:43 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2 Max datafile length: 54657023 Max keyfile length: 33554431 Recordlength: 834 Record format: Fixed length table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 1024 1024 1 2 32 30 multip. text 10240 1024 1 Field Start Length Type 1 1 1 2 2 4 3 6 4 4 10 1 5 11 20 6 31 1 7 32 30 8 62 35 9 97 35 10 132 35 11 167 4 12 171 16 13 187 35 14 222 4 15 226 16 16 242 20 17 262 20 18 282 20 19 302 30 20 332 4 21 336 4 22 340 1 23 341 8 24 349 8 25 357 8 26 365 2 27 367 2 28 369 4 29 373 4 30 377 1 31 378 2 32 380 8 33 388 4 34 392 4 35 396 4 36 400 4 37 404 1 38 405 4 39 409 4 40 413 4 41 417 4 42 421 4 43 425 4 44 429 20 45 449 30 46 479 1 47 480 1 48 481 79 49 560 79 50 639 79 51 718 79 52 797 8 53 805 1 54 806 1 55 807 20 56 827 4 57 831 4 shell> myisampack station.MYI Compressing station.MYI: (1192 records) - Calculating statistics normal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11 pre-space: 0 end-space: 12 table-lookups: 5 zero: 7 Original trees: 57 After join: 17 - Compressing file 87.14% shell> ls -l station.* -rw-rw-r-- 1 monty my 127874 Apr 17 19:00 station.MYD -rw-rw-r-- 1 monty my 55296 Apr 17 19:04 station.MYI -rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm shell> myisamchk -dvv station MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-04-17 19:04:26 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1 Max datafile length: 16777215 Max keyfile length: 131071 Recordlength: 834 Record format: Compressed table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 10240 1024 1 2 32 30 multip. text 54272 1024 1 Field Start Length Type Huff tree Bits 1 1 1 constant 1 0 2 2 4 zerofill(1) 2 9 3 6 4 no zeros, zerofill(1) 2 9 4 10 1 3 9 5 11 20 table-lookup 4 0 6 31 1 3 9 7 32 30 no endspace, not_always 5 9 8 62 35 no endspace, not_always, no empty 6 9 9 97 35 no empty 7 9 10 132 35 no endspace, not_always, no empty 6 9 11 167 4 zerofill(1) 2 9 12 171 16 no endspace, not_always, no empty 5 9 13 187 35 no endspace, not_always, no empty 6 9 14 222 4 zerofill(1) 2 9 15 226 16 no endspace, not_always, no empty 5 9 16 242 20 no endspace, not_always 8 9 17 262 20 no endspace, no empty 8 9 18 282 20 no endspace, no empty 5 9 19 302 30 no endspace, no empty 6 9 20 332 4 always zero 2 9 21 336 4 always zero 2 9 22 340 1 3 9 23 341 8 table-lookup 9 0 24 349 8 table-lookup 10 0 25 357 8 always zero 2 9 26 365 2 2 9 27 367 2 no zeros, zerofill(1) 2 9 28 369 4 no zeros, zerofill(1) 2 9 29 373 4 table-lookup 11 0 30 377 1 3 9 31 378 2 no zeros, zerofill(1) 2 9 32 380 8 no zeros 2 9 33 388 4 always zero 2 9 34 392 4 table-lookup 12 0 35 396 4 no zeros, zerofill(1) 13 9 36 400 4 no zeros, zerofill(1) 2 9 37 404 1 2 9 38 405 4 no zeros 2 9 39 409 4 always zero 2 9 40 413 4 no zeros 2 9 41 417 4 always zero 2 9 42 421 4 no zeros 2 9 43 425 4 always zero 2 9 44 429 20 no empty 3 9 45 449 30 no empty 3 9 46 479 1 14 4 47 480 1 14 4 48 481 79 no endspace, no empty 15 9 49 560 79 no empty 2 9 50 639 79 no empty 2 9 51 718 79 no endspace 16 9 52 797 8 no empty 2 9 53 805 1 17 1 54 806 1 3 9 55 807 20 no empty 3 9 56 827 4 no zeros, zerofill(2) 2 9 57 831 4 no zeros, zerofill(1) 2 9
Die Informationen, die myisampack ausgibt, sind unten beschrieben:
normal
Die Anzahl von Spalten, für die keine spezielle Komprimierung benutzt wird.
empty-space
Die Anzahl von Spalten, die Werte enthalten, die ausschließlich aus Leerzeichen bestehen. Diese Werte nehmen 1 Bit in Anspruch.
empty-zero
Die Anzahl von Spalten, die Werte enthalten, die nur aus binären Nullen bestehen. Diese Werte nehmen 1 Bit in Anspruch.
empty-fill
Die Anzahl von Ganzzahl-Spalten, die nicht den gesamten Bereich Ihres Typs
einnehmen. Diese werden auf einen kleineren Typ geändert (eine
INTEGER-Spalte kann zum Beispiel auf MEDIUMINT geändert
werden).
pre-space
Die Anzahl von Dezimal-Spalten, die mit führenden Leerzeichen gespeichert sind. In diesem Fall enthält jeder Wert einen Zähler für die Anzahl führender Leerzeichen.
end-space
Die Anzahl von Spalten, die viele Leerzeichen am Ende enthalten. In diesem Fall enthält jeder Wert einen Zähler für die Anzahl von Leerzeichen am Ende.
table-lookup
Die Spalte hat nur eine kleine Anzahl verschiedener Werte, die in
ENUM umgewandelt werden, bevor die Huffman-Kompression durchgeführt
wird.
zero
Die Anzahl von Spalten, bei denen alle Werte 0 sind.
Original trees
Die anfängliche Anzahl von Huffman-Bäumen.
After join
Die Anzahl von unterschiedlichen Huffman-Bäumen, die übrig sind, nachdem Bäume zusammengefasst wurden, um etwas Header-Platz zu sparen.
Nachdem eine Tabelle komprimiert wurde, gibt myisamchk -dvv
zusätzliche Informationen über jedes Feld aus:
Type
Der Feldtyp kann folgende Deskriptoren enthalten:
constant
Alle Zeilen haben denselben Wert.
no endspace
Kein Leerzeichen am Ende speichern.
no endspace, not_always
Kein Leerzeichen am Ende speichern und bei allen Werten keine Komprimierung für Leerzeichen am Ende durchführen.
no endspace, no empty
Kein Leerzeichen am Ende speichern. Keine leeren Werte speichern.
table-lookup
Die Spalte wurde zu ENUM umgewandelt.
zerofill(n)
Die wichtigsten n Bytes im Wert sind immer 0 und wurden nicht
gespeichert.
no zeros
Keine Nullen speichern.
always zero
0-Werte sind in 1 Bit gespeichert.
Huff tree
Der Huffman-Baum, der zu dem Feld gehört.
Bits
Die Anzahl von Bits, die im Huffman-Baum benutzt werden.
Nachdem Sie pack_isam/myisampack laufen gelassen haben,
müssen Sie isamchk / myisamchk laufen lassen, um den Index
neu zu erzeugen. Zugleich können Sie die Index-Blöcke sortieren und die
Statistiken erzeugen, die benötigt werden, damit der MySQL-Optimierer
effizienter läuft:
myisamchk -rq --analyze --sort-index tabelle.MYI isamchk -rq --analyze --sort-index tabelle.ISM
Nachdem Sie die komprimierte Tabelle ins MySQL-Datenbank-Verzeichnis
gespielt haben, müssen Sie mysqladmin flush-tables ausführen, um
mysqld anzuweisen, die neue Tabelle zu benutzen.
Wenn Sie eine gepackte Tabelle entpacken wollen, können Sie das mit der
--unpack-Option für isamchk oder myisamchk tun.
© 1995-2005 MySQL AB. All rights reserved.
