Benefícios da execução da consulta OPTIMIZE TABLE no MySQL DB Server

9

Eu gostaria de saber quais são os benefícios [realmente práticos] que podem ser obtidos executando a OPTIMIZE TABLE tbl_nameconsulta no MySQL Server.

Eu verifiquei isso uma vez e descobri que, após a execução, o próximo hit do banco de dados leva muito tempo, devido à realocação de fragmentos, mas os hits subsequentes mostram o tipo de desempenho, não tenho certeza se o cache da consulta faz esse truque somente com otimização ou otimização, esse truque.

Alguém pode me orientar com alguns valores reais de diferença de desempenho, se possível, para que eu possa ir mais longe, pois trabalhar com o MySQL está ganhando gravidade em nosso projeto.

Saravanan
fonte

Respostas:

7

Lembre-se de que OPTIMIZE TABLE não executa desfragmentação. Internamente, o OPTIMIZE TABLE executa várias operações (copiando dados para um arquivo temporário, recriar índices, recalcular estatísticas do índice). De fato, o exemplo que eu tenho pode ser realizado manualmente, como mostrado.

Exemplo: Se você otimizar mydb.mytable, insira este comando:

OPTIMIZE TABLE mydb.mytable;

Note que o mysql executa algo o seguinte sob o capô:

CREATE TABLE mydb.mytable2 LIKE mydb.mytable;
ALTER TABLE mydb.mytable2 DISABLE KEYS;
INSERT INTO mydb.mytable2 SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable2 ENABLE KEYS;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytable2 RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;

Isso é bastante útil para tabelas que apresentam um alto volume de UPDATEs e DELETEs

Realizar isso pode realizar duas coisas

  1. Impeça o mysql de procurar fragmentos em uma tabela na tentativa de carregar dados nos fragmentos do tamanho certo. A eliminação desses fragmentos reduzirá essa operação.

  2. A recomputação das estatísticas do índice ajuda o MySQL Query Optimizer a construir melhores planos EXPLAIN. Caso contrário, as consultas poderão se deteriorar no tempo de execução porque o MySQL Query Optimizer decidiu adivinhar o plano EXPLAIN. Isso seria um sintoma definitivo de uma tabela que teve um alto volume de UPDATEs e DELETEs.

EMBARGO

No que diz respeito ao armazenamento em cache, o armazenamento em cache mergulha rapidamente por causa de uma verificação completa da tabela. Para páginas de índice MyISAM, as páginas entram e saem do MyISAM Key Cache. Para o InnoDB, as páginas de dados e índice entram e saem do InnoDB Buffer Pool.

RolandoMySQLDBA
fonte
Obrigado pela sua resposta. Do seu ponto de vista, entendo que é melhor usar algum serviço, como um trabalho cron, para agendar a tabela de otimização para uma das minhas tabelas atualizadas com frequência, para que eu possa obter melhor desempenho. Além disso, estou usando o InnoDB para esta tabela. Essa é uma escolha melhor. Além disso, acho que as junções do HASH no SQL Server foram sugeridas para melhorar o desempenho da consulta. Você pode explicar isso para mim e como obter uma semelhante a essa no MySQL. Também, por favor, me dê um otimizador de consultas SQL para MySQL [versão Windows7].
precisa
@savaranan: O MySQL Query Optimizer a que me referia era o interno incorporado ao MySQL. BTW Como a tabela que você deseja otimizar é o InnoDB, você pode pular as etapas DISABLE KEYS e ENABLE KEYS. Além disso, ANALYZE TABLE pode ser ignorado porque é totalmente inútil nas tabelas do InnoDB, pois o InnoDB recalcula as cardinalidades de suas tabelas aproximando-as de perto, usando as páginas dos índices BTREE, conhecidas como mergulhos de índice.
RolandoMySQLDBA
@savaranan: No que diz respeito aos índices HASH, o InnoDB possui índices de hash adaptativos ( dev.mysql.com/doc/refman/5.5/en/innodb-adaptive-hash.html ). Há também nice sugestões sobre emulando seus próprios índices hash e manipulação de colisões baseado em páginas 103-106 de "Performance MySQL High" ( amazon.com/dp/0596101716 )
RolandoMySQLDBA