O que significa “Tabela não oferece suporte a otimização, recriando + análise ao invés”?

97

Estou trabalhando no MySQL 5.5 e tentando reconstruir o índice usando uma OPTIMIZE TABLEconsulta. Estou recebendo o erro abaixo:

A tabela não suporta a otimização, fazendo recriação + análise em vez disso

O que isto significa? O mecanismo MySQL não está permitindo a reconstrução do índice? O que está sendo feito por trás desta mensagem, no nível do MySQL 5.5 Engine?

Vikrant More
fonte

Respostas:

190

Essa é realmente uma mensagem informativa.

Provavelmente, você está OPTIMIZE em uma tabela InnoDB (tabela usando o mecanismo de armazenamento InnoDB, em vez do mecanismo de armazenamento MyISAM ).

InnoDB não suporta o OPTIMIZE da mesma forma que MyISAM. Ele faz algo diferente. Ele cria uma tabela vazia e copia todas as linhas da tabela existente para ela e, essencialmente, exclui a tabela antiga e renomeia a nova tabela e, em seguida, executa um ANALYZE para reunir estatísticas. Isso é o mais próximo que o InnoDB pode chegar de um OPTIMIZE.

A mensagem que você está recebendo é basicamente o servidor MySQL repetindo o que o mecanismo de armazenamento InnoDB disse ao servidor MySQL:

Tabela não suporta otimizar é o mecanismo de armazenamento InnoDB dizendo ...

"Eu (o mecanismo de armazenamento InnoDB) não faço uma operação OPTIMIZE como meu amigo (o mecanismo de armazenamento MyISAM) faz."

"fazendo recriar + analisar em vez disso" é o mecanismo de armazenamento InnoDB dizendo ...

"Decidi realizar um conjunto diferente de operações que obterá um resultado equivalente."

spencer7593
fonte
13
ok, poderia compartilhar a maneira diferente que você está fazendo.
Vikrant More
Tenho certeza de que isso está em algum lugar no Manual de Referência do MySQL; este é um comportamento esperado e nada com que se preocupar. (Exceto que a tabela ficará "bloqueada" e indisponível enquanto o processo é executado até a conclusão, o que pode demorar um pouco para uma tabela HUGH JASS.) Referência: https://dev.mysql.com/doc/refman/5.5/ pt / Optimize-table.html Consulte a seção "Detalhes do InnoDB".
spencer7593
Você também pode usar o MySQL Workbench para realizar a otimização da tabela. Consulte a documentação do Schema and Table Inspector para obter informações adicionais. Observe a opção "Otimizar Tabela".
Philip Olson
1
Excelente explicação para pessoas que estão iniciando no mundo db. Muito obrigado
tachomi
5
Cuidado - não use isso se você estiver com pouco espaço em disco, pois pode fazer com que o seu servidor fique sem tempo tentando recriar a tabela muito grande.
Danny Staple
22

OPTIMIZE TABLEfunciona bem com o mecanismo InnoDB de acordo com o artigo de suporte oficial: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

Você notará que otimizar tabelas InnoDB reconstruirá a estrutura da tabela e atualizará as estatísticas de índice (algo como ALTER TABLE)

Lembre-se de que esta mensagem pode ser apenas informativa e a informação mais importante é o status da sua consulta: OK!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+
Sdesvergez
fonte
2
Na verdade, não, o MySQL fornecerá o motivo da falha: Falha de gravação de arquivo temporário, Falha na operação.
iwind
9

A melhor opção é criar uma nova tabela com as mesmas propriedades

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

Renomeie NEW.NAME.TABLE e TABLE.CRASH

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

Depois de trabalhar bem, delete

DROP TABLE <TABLE.CRASHED.BACKUP>;
tquang
fonte
1
Este método mantém índices e gatilhos?
Joel Murphy
1
Sim, claro. Todos eles! Você pode tentar e usar phpMyAdmin para verificar novamente
tquang
Isso não recria a chave estrangeira.
DanB 01 de
1

A melhor opção é criar uma nova tabela, copiar as linhas para a tabela de destino, eliminar a tabela real e renomear a tabela recém-criada. Este método é bom para tabelas pequenas,

ASHOK MANGHAT
fonte
3
Eu sugeriria montar um código de exemplo para acompanhar sua resposta. Veja como escrevo uma boa resposta
Frits,