8.2. myisampack, el generador de tablas comprimidas de sólo lectura de MySQL

MySQL 5.0

8.2. myisampack, el generador de tablas comprimidas de sólo lectura de MySQL

La utilidad myisampack comprime tablas . 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 para realizar operaciones de mapeo en memoria de tablas comprimidas. Si 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 , 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 o . El antiguo programa pack_isam para tablas no puede.

Invoque myisampack de la siguiente forma:

shell> myisampack []  ...

Cada nombre de fichero debe ser el nombre de un fichero índice () . Si no se encuentra en el directorio de la base de datos, debe especificar la ruta al fichero. Se permite omitir la extensión .

myisampack soporta las siguientes opciones:

  • ,

    Muestra mensaje de ayuda y acaba.

  • ,

    Realiza una copia de seguridad de los datos de la tabla usando el nombre .OLD.

  • ], ]

    Escribe un log de depuración. La cadena de caracteres a menudo es '.

  • ,

    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 .TMD cuando comprime la tabla. Si se mata myisampack, el fichero puede no borrarse.) Normalmente, myisampack acaba con un error si encuentra que .TMD existe. Con , se fuerza myisampack a comprimir la tabla.

  • ,

    Junta todas las tablas nombradas en la línea de comandos en una única tabla . Todas las tablas que hay que combinar deben tener una estructura idéntica (los mismos nombres de columna y tipos, los mismos índices, etc).

  • ,

    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.

  • ,

    Modo silencioso. Sólo muestra mensajes de error.

  • ,

    No comprime la tabla, sólo prueba la compresión.

  • ,

    myisampack crea en ese directorio los ficheros temporales.

  • ,

    Modo explícito. Muestra información sobre el proceso de compresión y su resultado.

  • ,

    Muestra información de la versión y sale.

  • ,

    Espera y vuelve a empezar si la tabla está en uso. Si el servidor mysqld se invocó con la opción , 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:

  • Número de columnas para el que no se necesita compresión extra.

  • Número de columnas que contienen valores que son sólo espacios, que ocupan un bit.

  • Número de columnas que contienen valores que son sólo ceros binarios; ocupan un bit.

  • 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 (ocho bytes) puede almacenarse como una columna (un byte) si todos sus valores están en el rango de a .

  • 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.

  • 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.

  • La columna tiene pocos valores distintos, que se convierten a antes de la compresión Huffman.

  • Número de columnas cuyos valores son todos cero.

  • Número inicial de árboles Huffman.

  • 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:

  • El tipo de la columna. El valor puede contener cualquiera de los siguientes descriptores:

    • Todos los registros tienen el mismo valor.

    • No guarda el espacio final.

    • No guarda el espacio final y no realiza compresión en caso de que haya espacio final en todos los valores.

    • No guarda el espacio final. No guarda valores vacíos.

    • La columna se convirtió a .

    • )

      Los bytes más significativos en el valor son siempre 0 y no se guardan.

    • No almacena ceros.

    • Los valores cero se guardan usando un bit.

  • Número de árboles Huffman asociados con cada columna.

  • 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 .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 con myisamchk o isamchk.