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.
myisampacktambém pode compactar colunasBLOBouTEXT. 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, --backupRealiza um backup da tabela como
nome_tabela.OLD.-#, --debug=debug_optionsLog da saída de depuração. A string
debug_optionsgeralmante é'd:t:o,nome_arquivo'.-f, --forceForça a compactação da tabela mesmo se ela se tornar maior ou se o arquivo temporário existir.
myisampackcria um arquivo temporário chamadonome_tabela.TMDenquanto ele compacta a tabela. Se você matar omyisampacko arquivo.TMDnão pode ser removido. Normalmente,myisampacksai com um erro se ele descobrir quenome_tabela.TMDexiste. Com--force,myisampackcompacta a tabela de qualquer maneira.-?, --helpExibe uma mensagem de ajuda e sai.
-j nome_tabela_grande, --join=nome_tabela_grandeUne 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. (
myisampackarmazena todas as linhas com ponteiros de tamanhos 1, 2 ou 3 bytes. Na maioria dos casos normais,myisampackpode 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 casomyisampackirá exibir uma nota dizendo que a próxima vez que você compactar o mesmo arquivo você pode utilizar um registro de tamanho menor.)-s, --silentModo silencioso. Escreve a saída somente quando algum erro ocorrer.
-t, --testNão compacta realmente a tabela, apenas testa a sua compactação.
-T dir_name, --tmp_dir=dir_nameUtiliza o diretório especificado como a localização em que serão gravadas as tabelas temporárias.
-v, --verboseModo verbose. Escreve informação sobre o prograsso e resultado da compactação.
-V, --versionExibe informação de versão e sai.
-w, --waitEspera e tenta novamente se a tabela estiver em uso. Se o servidor
mysqldfoi iniciado com a opção--skip-locking, não é uma boa idéia chamarmyisampackse 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 stationMyISAM 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.MYICompressing 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 stationMyISAM 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:
normalO número de colunas para qual nenhum empacotamento extra é utilizado.
empty-spaceO número de colunas contendo valores que são somente espaços; estes ocuparão apenas 1 bit.
empty-zeroO número de colunas contendo valores que são somente 0's binários; ocuparão 1 bit.
empty-fillO 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
INTEGERpode ser alterada paraMEDIUMINT).pre-spaceO 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-spaceO 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-lookupA coluna tem somente um pequeno número de valores diferentes, que são convertidos para um
ENUMantes da compressão Huffman.zeroO número de colunas em que todos os valores estão zerados.
Original treesO número inicial de árvores Huffman.
After joinO 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:
TypeO tipo de campo deve conter as seguites descrições:
constantTodas linhas tem o mesmo valor.
no endspaceNão armazena espaços no fim.
no endspace, not_alwaysNão armazena espaços no fim e não faz compactação de espaços finais para todos os valores.
no endspace, no emptyNão armazena espaços no fim. Não armazena valores vazios.
table-lookupA coluna foi convertida para um
ENUM.zerofill(n)Os
nbytes mais significativos no valor são sempre 0 e não são armazenados.no zerosNão armazena zeros.
always zeroValores zero são armazenados em 1 bit.
Huff treeA árvore Huffman associada com o campo.
BitsO 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.