Se você executou um reparo no MyISAM, ele deve reduzir o tamanho do MYI
. Por quê?
Quando um mysqldump cria e carrega uma tabela MyISAM, pense nas etapas mecânicas para fazer mytable
:
CREATE TABLE mytable ...
LOCK TABLE mytable ...
ALTER TABLE mytable DISABLE KEYS; (shuts off updates to non-unique indexes)
INSERT INTO ...
INSERT INTO ...
.
.
.
ALTER TABLE mytable ENABLE KEYS; (rebuild all indexes)
UNLOCK TABLES;
Durante o ALTER TABLE ... ENABLE KEYS
, você executa SHOW PROCESSLIST;
Você verá as informações desse processo dizendo Repair by sorting
Quando terminar, você deve ter um MYI com 95% de mais nós BTTE preenchidos até a capacidade.
Por que tanto espaço desaparece quando você conserta? Olhe para o caso oposto.
Você está carregando uma tabela em ordem numérica em algum ID de auto_increment. Carregar dados de alguma forma ordenada produz uma distribuição de chaves desequilibrada nos índices BTREE. Em alguns casos, todos os nós podem ter até 45% de fragmentação.
EXEMPLO: Se você tiver uma árvore binária (a pior BTREE) carregada em ordem, você terá uma árvore binária inclinada para a direita, que deve se parecer com uma lista encadeada com uma inclinação negativa.
Certa vez mencionei esse fenômeno louco em meus posts do DBA StackExchange
-
Aug 03, 2011
: Quando devo recriar os índices? -
Jun 28, 2012
: Benefícios do BTREE no MySQL -
Oct 26, 2012
: O quanto o innodb se fragmenta diante de inserções um pouco fora de ordem?
A execução de um REPAIR TABLE
no cliente mysql, executando myisamchk -r
ou recarregando um mysqldump de um MyISAM, deverá produzir sempre um arquivo de índice MyISAM menor.