La utilidad myisampack comprime tablas
MyISAM
. myisampack funciona
comprimiendo cada columna de la tabla separadamente. Normalmente,
myisampack comprime el fichero de datos un
40%-70%.
Cuando la tabla se utiliza posteriormente, el servidor lee en la memoria la información que se necesita para descomprimir las columnas. Esto da un rendimiento mucho mejor al acceder a registros individuales, ya que sólo se tiene que descomprimir un registro.
Siempre que es posible, MySQL utiliza mmap()
para realizar operaciones de mapeo en memoria de tablas
comprimidas. Si mmap()
no funciona, MySQL
vuelve a operaciones normales de escritura/lectura en ficheros.
Tenga en cuenta lo siguiente:
-
Si el servidor mysqld se invoca con la opción
--skip-external-locking
, no es buena idea invocar myisampack si la tabla tiene que actualizarse durante el proceso de compresión. -
Tras su compresión, una tabla será de sólo lectura. Esto, normalmente, es lo deseable (como cuando se accede a tablas comprimidas en un CD). Permitir escrituras en tablas comprimidas está en nuestra lista de cosas pendientes, pero con poca prioridad.
-
myisampack comprime columnas
BLOB
oTEXT
. El antiguo programa pack_isam para tablasISAM
no puede.
Invoque myisampack de la siguiente forma:
shell> myisampack [opciones
]nombre_fichero
...
Cada nombre de fichero debe ser el nombre de un fichero índice
(.MYI
) . Si no se encuentra en el directorio
de la base de datos, debe especificar la ruta al fichero. Se
permite omitir la extensión .MYI
.
myisampack soporta las siguientes opciones:
-
--help
,-?
Muestra mensaje de ayuda y acaba.
-
--backup
,-b
Realiza una copia de seguridad de los datos de la tabla usando el nombre
nombre_tabla
.OLD. -
--debug[=
opciones_de_depuración
],-# [
opciones_de_depuración
]Escribe un log de depuración. La cadena de caracteres
opciones_de_depuración
a menudo es'd:t:o,
nombre_fichero
'. -
--force
,-f
Crea una tabla comprimida incluso si llega a ser mayor que la original o si el fichero temporal de una invocación anterior de myisampack ya existe. (myisampack crea un fichero temporal llamado
nombre_tabla
.TMD cuando comprime la tabla. Si se mata myisampack, el fichero.TMD
puede no borrarse.) Normalmente, myisampack acaba con un error si encuentra quenombre_tabla
.TMD existe. Con--force
, se fuerza myisampack a comprimir la tabla. -
--join=
nombre_de_tabla_grande
,-j
nombre_de_tabla_grande
Junta todas las tablas nombradas en la línea de comandos en una única tabla
nombre_de_tabla_grande
. Todas las tablas que hay que combinar deben tener una estructura idéntica (los mismos nombres de columna y tipos, los mismos índices, etc). -
--packlength=
#
,-p
#
Especifica el tamaño de almacenamiento del registro, en bytes. El valor debe ser 1, 2, o 3. myisampack almacena todos los registros con punteros de 1, 2, o 3 bytes. En la mayoría de casos normales, myisampack puede determinar el valor de longitud óptimo antes de empezar a comprimir el fichero, pero puede darse cuenta durante el proceso de compresión de que podría haber usado una longitud inferior. En ese caso, myisampack muestra una nota diciendo que en la siguente compresión del mismo fichero, puede usarse una longitud de fichero inferior.
-
--silent
,-s
Modo silencioso. Sólo muestra mensajes de error.
-
--test
,-t
No comprime la tabla, sólo prueba la compresión.
-
--tmpdir=
ruta
,-T
ruta
myisampack crea en ese directorio los ficheros temporales.
-
--verbose
,-v
Modo explícito. Muestra información sobre el proceso de compresión y su resultado.
-
--version
,-V
Muestra información de la versión y sale.
-
--wait
,-w
Espera y vuelve a empezar si la tabla está en uso. Si el servidor mysqld se invocó con la opción
--skip-external-locking
, no es buena idea invocar myisampack si existe la posibilidad que el servidor actualice la tabla durante el proceso de compresión.
La siguiente secuencia de comandos ilustra una típica sesión de compresión de tablas:
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% Remember to run myisamchk -rq on compressed tables 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 Datafile pointer (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
myisampack muestra la siguiente información:
-
normal
Número de columnas para el que no se necesita compresión extra.
-
empty-space
Número de columnas que contienen valores que son sólo espacios, que ocupan un bit.
-
empty-zero
Número de columnas que contienen valores que son sólo ceros binarios; ocupan un bit.
-
empty-fill
Número de columnas de tipo entero que no ocupan el rango completo de bytes de su tipo; se cambian a un tipo inferior. Por ejemplo, una columna
BIGINT
(ocho bytes) puede almacenarse como una columnaTINYINT
(un byte) si todos sus valores están en el rango de-128
a127
. -
pre-space
Número de columnas decimales que se almacenan con espacios iniciales. En este caso, cada valor contiene un contador para el número de espacios precedentes.
-
end-space
Número de columnas que tienen muchos espacios al final. En este caso, cada valor contiene un contador para el número de espacios al final.
-
table-lookup
La columna tiene pocos valores distintos, que se convierten a
ENUM
antes de la compresión Huffman. -
zero
Número de columnas cuyos valores son todos cero.
-
Original trees
Número inicial de árboles Huffman.
-
After join
Número de árboles Huffman distintos que quedan tras unir árboles para tener algún espacio de cabecera.
Tras comprimir una tabla, myisamchk -dvv muestra información adicional acerca de cada columna:
-
Type
El tipo de la columna. El valor puede contener cualquiera de los siguientes descriptores:
-
constant
Todos los registros tienen el mismo valor.
-
no endspace
No guarda el espacio final.
-
no endspace, not_always
No guarda el espacio final y no realiza compresión en caso de que haya espacio final en todos los valores.
-
no endspace, no empty
No guarda el espacio final. No guarda valores vacíos.
-
table-lookup
La columna se convirtió a
ENUM
. -
zerofill(
n
)Los
n
bytes más significativos en el valor son siempre 0 y no se guardan. -
no zeros
No almacena ceros.
-
always zero
Los valores cero se guardan usando un bit.
-
-
Huff tree
Número de árboles Huffman asociados con cada columna.
-
Bits
Número de bits usados en el árbol Huffman.
Tras ejecutar myisampack, es necesario lanzar myisamchk para volver a crear algunos índices. Al mismo tiempo, se puede ordenar los bloques de índices y crear estadísticas, que el optimizador MySQL necesita para trabajar de forma más eficiente:
shell> myisamchk -rq --sort-index --analyze nombre_de_tabla
.MYI
Una vez instalada la tabla comprimida en el directorio de la base de datos MySQL, debe ejecutar mysqladmin flush-tables para forzar mysqld a comenzar a usar la nueva tabla.
Para descomprimir una tabla comprimida, use la opción
--unpack
con myisamchk o
isamchk.