Qual é a diferença entre otimizar tabela e analisar tabela no mysql

29

Qual é a diferença entre otimizar tabela e analisar tabela no mysql? Eu li os documentos on-line, mas não sei qual é a diferença.

boleano
fonte

Respostas:

28

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;

MyISAM

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.mytableencolheria os arquivos .MYDe .MYIpara a tabela.

Isso não é o mesmo para o InnoDB. Aqui está como é diferente:

InnoDB ( innodb_file_per_table ativado)

Os dados e índices de cada tabela são armazenados em um arquivo de espaço de tabela externo. Para datadiris /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.ibddiminui.

InnoDB ( innodb_file_per_table desativado)

/var/lib/mysql/mydb/mytable.frmexistiria. Todos os dados e páginas de índice da tabela mydb.mytablesã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

InnoDB Plumbing

ATUALIZAÇÃO 26-02-2013 22:33 EST

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 TABLEcomo 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 TABLEuma 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, UPDATEse 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 TABLEInnoDB em certos casos:

RolandoMySQLDBA
fonte
Eu acho que, otimizar tabela para innodb não é suportado. Recebi uma mensagem, o índice será recriado. Como funciona?
Booleano
@RolandoMySQLDBA Não sei ao certo o que significa quando você diz "você não pode executar OPTIMIZE TABLE". Quando você OPTIMIZE TABLEusa uma tabela do InnoDB, o MySQL está executando as operações ALTER TABLE ... ENGINE=InnoDBe ANALYZE TABLE ...para você quando diz "fazendo a tabela recriar + analisar".
Michael - sqlbot
@ Michael-sqlbot Como mostrado na minha resposta, eu corri 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;.
RolandoMySQLDBA 27/02
Certo, mas eu diria que isso aconteceu imediatamente para você, porque a tabela contra a qual você testou era muito pequena. Quando você está OPTIMIZE TABLEno InnoDB, o servidor realmente executa ALTER TABLE ... ENGINE=InnoDBe ANALYZE TABLEnos bastidores antes de retornar essa resposta ... para que você possa executar o OPTIMIZE TABLEInnoDB e obter o efeito pretendido.
Michael - sqlbot
15

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.

Mitch Wheat
fonte