Preciso reindexar a tabela mysql após a exclusão em massa?

10

Eu tenho uma tabela no MySQL com muito INSERT e SELECT a cada segundo. E há uma exclusão em massa de alguns dados mais antigos uma vez por dia. Preciso reindexar a tabela após a exclusão? Eu quero aumentar o desempenho. Alguém pode sugerir algumas dicas? Usando 'innodb' como o mecanismo de armazenamento. Preciso mudar isso? Eu acho que é melhor para inserir e selecionar simultaneamente. Por favor, dê suas sugestões. Preciso fazer uma reindexação?

Desde já, obrigado..

Ajay
fonte

Respostas:

10

Você precisa otimizar as tabelas ao usar o InnoDB? Sim e não, dependendo da sua carga de trabalho e se você está enfrentando problemas de desempenho ou não.

Um copiar-colar descarado da documentação do MySQL :

Para tabelas InnoDB, OPTIMIZE TABLE é mapeado para ALTER TABLE, que reconstrói a tabela para atualizar estatísticas do índice e liberar espaço não utilizado no índice clusterizado. Isso é exibido na saída de OPTIMIZE TABLE quando você a executa em uma tabela InnoDB, conforme mostrado aqui:

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                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

Esta operação não usa criação rápida de índice. Os índices secundários não são criados com a mesma eficiência porque as chaves são inseridas na ordem em que apareceram na chave primária. Consulte a Seção 14.14.6, “Limitações da criação rápida de índices”.

O InnoDB armazena dados usando um método de alocação de página e não sofre fragmentação da mesma maneira que os mecanismos de armazenamento herdados (como o MyISAM). Ao considerar a otimização da execução ou não, considere a carga de trabalho das transações que o servidor processará:

  • É esperado algum nível de fragmentação. O InnoDB preenche apenas 93% das páginas, para deixar espaço para atualizações sem precisar dividir as páginas.

  • As operações de exclusão podem deixar lacunas que deixam as páginas menos preenchidas do que o desejado, o que pode valer a pena otimizar a tabela.

  • As atualizações nas linhas geralmente reescrevem os dados na mesma página, dependendo do tipo de dados e formato da linha, quando há espaço suficiente. Consulte a Seção 14.10.5, “Como a compactação funciona para tabelas do InnoDB” e a Seção 14.12.1, “Visão geral do armazenamento de linhas do InnoDB”.

  • Cargas de trabalho de alta simultaneidade podem deixar lacunas nos índices ao longo do tempo, pois o InnoDB retém várias versões dos mesmos dados devido ao seu mecanismo MVCC. Consulte a Seção 14.5.12, “Multi-Versioning do InnoDB”.


fonte
5

Você pode reindexar a mesa e até encolher a mesa. No entanto, se você deseja atrasar essa manutenção baseada em disco, você deve, no mínimo, recalcular as estatísticas do índice.

Sem recalcular as estatísticas do índice, o MySQL Query Optimizer pode fazer más escolhas para os planos EXPLAIN de consulta. Isso pode afetar adversamente os SELECTs se as estatísticas para dados inexistentes ainda estiverem presentes. Isso é verdade para o MyISAM e o InnoDB.

Você não precisa reduzir a tabela para calcular as estatísticas do índice, embora seja melhor para o desempenho geral.

Para calcular estatísticas para todos os índices em uma tabela, você deve executar

ANALYZE TABLE tablename;

Você poderia fazer isso todas as noites. Ele não tentará desfragmentar ou reduzir os dados. Você provavelmente poderia fazer isso uma vez por semana executando OPTIMIZE TABLE tablename;. Isso também será útil ANALYZE TABLE tablename;para você após o encolhimento do arquivo físico da tabela ( .ibdpara InnoDB ou .MYIMyISAM) ou.

RolandoMySQLDBA
fonte
3

OPTIMIZE TABLE quase nunca é necessário no InnoDB.

Você está EXCLUINDO registros com base na idade? Nesse caso, você pode tornar a "exclusão em massa" essencialmente livre usando PARTITIONing e DROP PARTITION. Mais detalhes aqui: http://mysql.rjweb.org/doc.php/partitionmaint

Rick James
fonte