[+/-]
MyISAM
é o tipo de tabela padrão no MySQL
Versão 3.23. Ela é baseada no código ISAM
e
possui várias extensões úteis.
O índice é armazenado em um arquivo com extensão
.MYI
(MYIndex), e os dados são armazenados
em um arquivo com a extensão .MYD
(MYData).
Você pode verificar/reparar tabelas MyISAM
com
o utilitário myisamchk
. See
Secção 4.5.6.7, “Uso do myisamchk
para Recuperação em Caso de Falhas”. Você pode compactar tabelas
MyISAM
com myisampack
para
utilizar menos espaço. See Secção 4.8.4, “myisampack
, O Gerador de Tabelas Compactadas de
Somente Leitura do MySQL”. O itens
seguintes são novos no MyISAM
:
Existe um parâmetro no arquivo MyISAM
que
indica se a tabela foi fechada corretamente. Se o
mysqld
é iniciado com
--myisam-recover
, tabelas
MyISAM
serão automaticamente verificadas
e/ou reparadas na abertura se a tabela não foi fechada
apropriadamente.
Você pode INSERIR
novas linhas em uma
tabela que não tenha blocos livres no meio do arquivo de
dados, na mesma hora outras threadas são lidas da tabela
(inserção concorrente). Um bloco livre pode vir de uma
atualização de uma linha de tamanho dinâmico com muitos
dados para uma linha com menos dados ou ao deletarmos linhas.
Quando todos os blocos livres são usados, todas as
inserções futurs serão concorrentes de novo.
Suporte a grandes arquivos (63-bit) em sistema de arquivos/sistemas operacionais que suportam grandes arquivos.
Todo dado é armazenado com byte mais baixo primeiro. Isto torna a máquina e SO independentes. A única exigência para a portabilidade do arquivo binário é que a a máquina utilize inteiros com sinais em complemento de dois (como toda a máquina nos últimos 20 anos tem) e formato de pontos flutuante IEEE (também totalmente dominante entre máquinas mainstream). A única área de máquinas que não podem suportar compatibilidade binária são sistemas embutidos (porque eles, algumas vezes, tem processadores peculiares).
Não há uma grande perda de velocidade em armazenar o byte mais baixo de dados primeiro; os bytes em um registro de tabela estão normalmente desalinhados e isto não dá muito poder de leitura do byte desalinhado em outra ordem além da ordem reversa. O código atual busca-valor-coluna também não é crítico em relação ao tempo comparado a outro código.
Todas as chaves numéricas estão armazendas com o byte mais alto em primeiro para conseguir melhor compactação do índice.
Tratamento interno de uma coluna
AUTO_INCREMENT
. MyISAM
irá atualizá-lo automaticamenteem um
INSERT/UPDATE
. O valor
AUTO_INCREMENT
pode ser zerado com
myisamchk
. Ele fará colunas
AUTO_INCREMENT
mais rápidas (pelo menos
10%) e números natigos não irão reutilizar como no antigo
ISAM
. Note que quando um
AUTO_INCREMENT
é definido no fim de uma
chave multi-parte o comportamento antigo ainda está presente.
Ao inserir ordenandamente (como quando se utiliza colunas
AUTO_INCREMENT
) a árvore chave será
separada de forma que o nodo mais alto contenha apenas uma
chave. Isto irá aumentar a utilização de espaço na árvore
de chaves.
Colunas BLOB
e TEXT
podem ser indexados.
Valores NULL
são perimitidos em colunas
indexadas. Isto gasta 0-1 bytes/chave.
O tamanho máximo da chave é de 500 bytes por padrão (pode ser alterado recomopilando). No caso de chaves maiores que 250 bytes, um tamanho de bloco de chave maior que o padrão de 1024 bytes é usado para esta chave.
Número máximo de chaves/tabelas é 32 por padrão. Isto pode
ser aumentado para 64 sem ser necessário recompilar
myisamchk
.
myisamchk
marcará as tabelas como
verificadas se alguém executá-las sem
--update-state
. myisamchk
--fast
só verificará aquelas tabelas que não
tenham esta marca.
myisamchk -a
armazena estatísticas para
partes de chaves(e não apenas para toda a chave como no
ISAM
).
Linhas de tamanho dinâmico serão agora muito menos fragmentados quando misturar deleções com atualizações e inserções. Isto é feito combinando automaticamente blocos deletados adjacentes e extendendo blocos se o próximo bloco é deletado.
myisampack
pode empacotar colunas
BLOB
e VARCHAR
.
Você pode colocar arquivos de dados e índices em diretórios
diferentes para obter maior velocidade (com a opção
DATA/INDEX DIRECTORY="caminho"
para
CREATE TABLE
). See
Secção 6.5.3, “Sintaxe CREATE TABLE
”.
MyISAM
também suporta os seguintes itens, os
quais o MySQL estará apto a utilizar em um futuro próximo:
Suporte a tipos VARCHAR
reais; uma coluna
VARCHAR
inicia com um tamanho armazenado em
2 bytes.
Tabelas com VARCHAR
podem ter um registro
de tamanho fixo ou dinâmico.
VARCHAR
e CHAR
podem ser
maior que 64K. Todos os segmentos de chaves têm a sua
própria definição de linguagem. Isto habilitará o MySQL
para ter diferentes definições de linguagens por coluna.
Um índice computado em hash pode ser usado para
UNIQUE
. Isto lhe permitirá ter
UNIQUE
em qualquer combinação de colunas
na tabela. (Você não pode procurar em um em um índice
computado UNIQUE
, de qualquer forma.)
Note que os arquivos de índice são muito menores com
MyISAM
que com ISAM
. Isto
significa que MyISAM
usará normalmente menos
recursos do sistema que ISAM
, mas precisará de
mais tempo de CPU quando inserir dados em um índice compactado.
As seguintes opções para mysqld
podem ser
usadas para alterar o comportamento de tabelas
MyISAM
. See Secção 4.6.8.4, “SHOW VARIABLES
”.
Opção | Descrição |
--myisam-recover=# |
Recuperação automática de tabelas com falhas. |
-O myisam_sort_buffer_size=# |
Buffer utilizado ao recuperar tabelas. |
--delay-key-write=ALL |
Não desarrega buffers de chaves entre escritas para qualquer tabela MyISAM |
-O myisam_max_extra_sort_file_size=# |
Usada paa ajudar o MySQL a decidir quando utilzar o método lento, mas seguro, de criação de índices de cache de chaves. Note este parâmetro é dado em megabytes antes da versão 4.0.3 e em bytes a partir desta versão. |
-O myisam_max_sort_file_size=# |
Não utilzia o método rápido de ordenação de índice para criar índices se o arquivo temporário se tornasse maior que o valor dado. Note que este parâmetro é dado em megabytes antes da versão 4.0.3 e em bytes a partir desta versão. |
-O bulk_insert_buffer_size=# |
Tamanho da arvore cache utilizado na otimização de inserções em bloco. Note que este é um limite por thread! |
A recuperação automática é ativada se você iniciar o
mysqld
com --myisam-recover=#
.
See Secção 4.1.1, “Opções de Linha de Comando do mysqld
”. Na abertura, é verificado
se a tabela está marcada como quebrada ou se a variavel de
contagem de abertura para esta tabela não é 0 e você a está
executando com --skip-external-locking
. Se
nenhuma das verificações acima forem verdadeiras o seguinte
ocorre.
Verifica-se se a tabela possui erros.
Se encontrarmos um erro, tente fazer um reparação rápida (com ordenação e sem recriar o arquivo de dados) da tabela.
Se o reparação falhar devido a um erro no arquivo de dados (por exemplo um erro de chave duplicada), é feita uma nova tentativa, mas desta vez o arquivo de dados é recriado.
Se a reparação falhar, tente mais uma vez com o antigo método de opção de reparação (escrever linha a linha sem ordenação) o qual deve estar apto a reparar qualquer tipo de erros com pequenas exigências de disco.
Se a recuperação não estiver apta a recuperar todas as linhas
de uma instrução completada previamente e você não especificou
FORCE
como uma opção para
myisam-recover
, então a reparação
automática abortará com uma mensagem de erro no arquivo de
erros:
Error: Couldn't repair table: test.g00pages
Caso você tenha utilizado a opção FORCE
,
você irá obter um aviso no arquivo de erro:
Warning: Found 344 of 354 rows when repairing ./test/g00pages
Note que se você executar uma recuperação automática com a
opção BACKUP
, você deve ter um script
cron
que mova automaticamente arquivos com nome
como tablename-datetime.BAK
do diretório de
banco de dados para uma media de backup.
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.