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 MySQL 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 colunas
BLOB
ou TEXT
. O antigo
pack_isam
(para tabelas
ISAM
) 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
chamado nome_tabela.TMD
enquanto ele
compacta a tabela. Se você matar o
myisampack
o arquivo
.TMD
não pode ser removido.
Normalmente, myisampack
sai com um erro
se ele descobrir que nome_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
caso myisampack
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 chamar myisampack
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 para
MEDIUMINT
).
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 MySQL 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 MySQL 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
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.