myisampack
, O Gerador de Tabelas Compactadas de Somente Leitura do MariaDB
myisampack
é usado para compactar tabelas MyISAM, e pack_isam
é usado para compactar tabelas ISAM. Como as tabelas ISAM estão ultrapassadas, nós iremos discutir aqui somente sobre o myisampack
, mas tudo dito sobre myisampack
também pode ser verdadeiro para o pack_isam
.
myisampack
trabalha compactando cada coluna na tabela separadamente. A informação necessária para descompactar colunas é lida em memória quando a tabela é aberta. Isto resulta em uma performance muito melhor quando estiver acessando registros individuais, porque você precisará descompactar somente um registro, não um bloco muito maior do disco como faz o Stacker no MS-DOS. Normalmente, myisampack
compacta o arquivo de dados 40%-70%.
O MariaDB utiliza mapeamento de memória (nmap()
) em tabelas compactadas e retorna ao uso normal de leitura e escrita se nmap()
não funcionar.
Por favor, note o seguinte:
- Depois de comapctada, a tabela é somente-leitura. Isto é, normalmente, pretendido (como quando acessamos tabelas compactadas em um CD). Permitir que se faça gravação em uma tabela compactada também está em nossa lista TODO, mas com baixa prioridade.
myisampack
também pode compactar colunasBLOB
ouTEXT
. O antigopack_isam
(para tabelasISAM
) não pode fazer isto.
myisampack
é chamado desta forma:
shell> myisampack [opções] nome_arquivo ...
Cada nome_arquivo deve ter o nome de um arquivo de índice (.MYI
). Se você não se encontra em um diretório de bancos de dados, você deve especificar o caminho completo para o arquivo. Pode-se omitir a extensão .MYI
.
myisampack
suporta as seguintes opções:
-b, --backup
Realiza um backup da tabela como
nome_tabela.OLD
.-#, --debug=debug_options
Log da saída de depuração. A string
debug_options
geralmante é'd:t:o,nome_arquivo'
.-f, --force
Força a compactação da tabela mesmo se ela se tornar maior ou se o arquivo temporário existir.
myisampack
cria um arquivo temporário chamadonome_tabela.TMD
enquanto ele compacta a tabela. Se você matar omyisampack
o arquivo.TMD
não pode ser removido. Normalmente,myisampack
sai com um erro se ele descobrir quenome_tabela.TMD
existe. Com--force
,myisampack
compacta a tabela de qualquer maneira.-?, --help
Exibe uma mensagem de ajuda e sai.
-j nome_tabela_grande, --join=nome_tabela_grande
Une todas as tabelas nomeadas na linha de comando em uma única tabela
nome_tabela_grande
. Todas tabelas que forem combinadas DEVEM ser idênticas (mesmos nomes de colunas e tipos, alguns índices, etc.).-p #, --packlength=#
Especifica o comprimento do tamanho de armazenamento, em bytes. O valor deve ser 1, 2 ou 3. (
myisampack
armazena todas as linhas com ponteiros de tamanhos 1, 2 ou 3 bytes. Na maioria dos casos normais,myisampack
pode determinar o valor correto do tamanho antes de começar a compactar o arquivo, mas ele pode notificar durante o processo de compactação que ele pode ter usado um tamanho menor. Neste casomyisampack
irá exibir uma nota dizendo que a próxima vez que você compactar o mesmo arquivo você pode utilizar um registro de tamanho menor.)-s, --silent
Modo silencioso. Escreve a saída somente quando algum erro ocorrer.
-t, --test
Não compacta realmente a tabela, apenas testa a sua compactação.
-T dir_name, --tmp_dir=dir_name
Utiliza o diretório especificado como a localização em que serão gravadas as tabelas temporárias.
-v, --verbose
Modo verbose. Escreve informação sobre o prograsso e resultado da compactação.
-V, --version
Exibe informação de versão e sai.
-w, --wait
Espera e tenta novamente se a tabela estiver em uso. Se o servidor
mysqld
foi iniciado com a opção--skip-locking
, não é uma boa idéia chamarmyisampack
se a tabela puder ser atualizada durante o processo de compactação.
A seqüência de comandos mostrados abaixo ilustra uma típica seção de compactação de tabelas:
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
A informação exibida pelo myisampack
é descrita abaixo:
normal
O número de colunas para qual nenhum empacotamento extra é utilizado.
empty-space
O número de colunas contendo valores que são somente espaços; estes ocuparão apenas 1 bit.
empty-zero
O número de colunas contendo valores que são somente 0's binários; ocuparão 1 bit.
empty-fill
O número de colunas inteiras que não ocupam a faixa completa de bytes de seu tipo; estes são alteradas para um tipo menor (por exemplo, uma coluna
INTEGER
pode ser alterada paraMEDIUMINT
).pre-space
O número de colunas decimais que são armazenadas com espaços a esquerda. Neste caso, cada valor irá conter uma contagem para o número de espaços.
end-space
O número de colunas que tem muitos espaços espaços extras. Neste caso, cada valor conterá uma contagem para o número de espaços sobrando.
table-lookup
A coluna tem somente um pequeno número de valores diferentes, que são convertidos para um
ENUM
antes da compressão Huffman.zero
O número de colunas em que todos os valores estão zerados.
Original trees
O número inicial de árvores Huffman.
After join
O número de árvores Huffman distintas que sobram depois de unir árvores para poupar espaço de cabeçalho.
Depois que uma tabela foi compactada, myisamchk -dvv
exibe informações adicionais sobre cada campo:
Type
O tipo de campo deve conter as seguites descrições:
constant
Todas linhas tem o mesmo valor.
no endspace
Não armazena espaços no fim.
no endspace, not_always
Não armazena espaços no fim e não faz compactação de espaços finais para todos os valores.
no endspace, no empty
Não armazena espaços no fim. Não armazena valores vazios.
table-lookup
A coluna foi convertida para um
ENUM.
zerofill(n)
Os
n
bytes mais significativos no valor são sempre 0 e não são armazenados.no zeros
Não armazena zeros.
always zero
Valores zero são armazenados em 1 bit.
Huff tree
A árvore Huffman associada com o campo.
Bits
O número de bits usado na árvore Huffman.
Depois de ter executado pack_isam
/myisampack
você deve executar o isamchk
/myisamchk
para recriar o índice. Neste momento você pode também ordenar os blocos de índices para criar estatísticas necessárias para o otimizador do MariaDB trabalhar de maneira mais eficiente.
myisamchk -rq --analyze --sort-index nome_tabela.MYI isamchk -rq --analyze --sort-index nome_tabela.ISM
Depois de instalar a tabela compactada no diretório de banco de dados MariaDB você deve fazer mysqladmin flush-tables
para forçar o mysqld
a iniciar usando a nova tabela.
Se você desejar descompactar uma tabela compactada, você pode fazer isto com a opção --unpack
para o isamchk
ou myisamchk
.