Respostas:
Para expandir a resposta de @ MitchWheat (+1 para responder diretamente primeiro):
ANALYZE TABLE examina a distribuição de chaves e as armazena em INFORMATION_SCHEMA.STATISTICS .
OPTIMIZE TABLE executa ANALYZE TABLE depois de fazer alguma compactação de tabela. O equivalente aOPTIMIZE TABLE mydb.mytable;
se a tabela era MyISAM é este:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Para a tabela MyISAM mydb.mytable no datadir /var/lib/mysql
, você tem os seguintes arquivos:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.MYD
(dados)/var/lib/mysql/mydb/mytable.MYI
(índices)OPTIMIZE TABLE mydb.mytable
encolheria os arquivos .MYD
e .MYI
para a tabela.
Isso não é o mesmo para o InnoDB. Aqui está como é diferente:
Os dados e índices de cada tabela são armazenados em um arquivo de espaço de tabela externo. Para datadir
is /var/lib/mysql
e a tabela mydb.mytable
, ele seria armazenado da seguinte maneira:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
Quando OPTIMIZE TABLE mydb.mytable
é executado, mytable.ibd
diminui.
Só /var/lib/mysql/mydb/mytable.frm
existiria. Todos os dados e páginas de índice da tabela mydb.mytable
são armazenados no arquivo de espaço de tabela do sistema /var/lib/mysql/ibdata1
.
Quando OPTIMIZE TABLE mydb.mytable
é executada, as páginas de dados e índice são gravadas contiguamente no ibdata1. Infelizmente, isso faz com que o ibdata1 cresça aos trancos e barrancos.
Veja a representação pictórica do Percona CTO Vadim Tkachenko
O seu comentário foi
Eu acho que, otimizar tabela para innodb não é suportado. Recebi uma mensagem, o índice será recriado. Como funciona?
Eu tentei isso
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> analyze table dat;
+----------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status | OK |
+----------+---------+----------+----------+
1 row in set (0.06 sec)
mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)
mysql>
Você está certo. Você não pode executar OPTIMIZE TABLE
como uma única operação. O que o InnoDB faz é o seguinte:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
Você também pode executar essas etapas você mesmo.
No entanto, com toda a honestidade, você não deve ter que executar ANALYZE TABLE
uma tabela do InnoDB porque cada vez que uma consulta é executada, o InnoDB Storage Engine realiza uma estimativa da cardinalidade da tabela com base na passagem de páginas nos índices. Se houver um número elevado de INSERTs
, UPDATEs
e DELETEs
, em seguida, você vai precisar ANALYZE TABLE
. Quando houver um número alto de DELETEs
, ALTER TABLE mydb.mytable ENGINE=InnoDB;
é necessário reduzir a tabela.
Na verdade, escrevi posts sobre a futilidade do ANALYZE TABLE
InnoDB em certos casos:
OPTIMIZE TABLE
". Quando você OPTIMIZE TABLE
usa uma tabela do InnoDB, o MySQL está executando as operações ALTER TABLE ... ENGINE=InnoDB
e ANALYZE TABLE ...
para você quando diz "fazendo a tabela recriar + analisar".
OPTIMIZE TABLE dat;
no MySQL 5.5.29 e ele reclamou imediatamente Table does not support optimize, doing recreate + analyze instead
,. É por isso que eu recomendo ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;
.
OPTIMIZE TABLE
no InnoDB, o servidor realmente executa ALTER TABLE ... ENGINE=InnoDB
e ANALYZE TABLE
nos bastidores antes de retornar essa resposta ... para que você possa executar o OPTIMIZE TABLE
InnoDB e obter o efeito pretendido.
Depende da sua versão do MySQL e do mecanismo de armazenamento, mas em geral:
OPTIMIZE TABLE Analisa a tabela, armazena a distribuição de chaves de uma tabela, recupera o espaço não utilizado e desfragmenta o arquivo de dados.
ANALISAR TABELA Somente analisa tabela e armazena a distribuição de chaves.