Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

tabela mysql muito grande e relatórios


Comece examinando a partition ing sua tabela se você ainda não tiver:

http://dev.mysql.com/doc/refman/5.1 /en/partitioning.html

http://www.slideshare.net/datacharmer/mysql-partitions-tutorial

http ://blog.mayflower.de/archives/353-Is-MySQL-partitioning-useful-for-very-big-real-life-problems.html

Como você está 'consolidando' seus dados? Talvez o método que você está usando não seja o ideal. Uma boa abordagem (deixe-me saber se isso é realmente o que você está fazendo) é criar uma tabela que contenha dados agregados. Então configure assim:

Primeiro, deixando de lado como os dados estão sendo despejados em sua tabela principal ...

  • Crie um trabalho (cron ou qualquer outro que você tenha à mão ou já configurado) que seja executado em um intervalo especificado, relativo a como os dados são carregados na tabela principal (vamos chamá-lo de MAIN , avançando). Se sua tabela MAIN for carregada a cada hora, sincronize-a. De meia hora? Não importa. Você pode verificar a velocidade de qualquer maneira ou, se estiver perto do horário de pico em que seus relatórios são executados, agende próximo a esse horário

  • Indexe corretamente sua tabela para dados consolidados. Vamos chamá-lo de AGG avançando.

  • Crie um procedimento armazenado que carregue dados de MAIN para AGG, que é basicamente um AGG LOAD FOR INTERVAL-? . Claro, você é o único aqui que sabe como ou quando os dados são inseridos no MAIN, então você também será aquele que sabe qual é a intenção de agregação. Também é possível continuar executando o procedimento armazenado de agregação se a intenção de agregação não for concluída (digamos que seja por um dia inteiro .. portanto, é uma execução cumulativa até que seja definida)

  • Use STAGING mesas. Para mim, eles são os melhores .

  • Crie um procedimento armazenado que verifique novamente os dados, para que qualquer atualização ou inserção adicional de registros possa ser refletida na tabela AGG executando este procedimento. Inclua parâmetros para o intervalo a ser atualizado. Se for diário, então você tem um DAILY AGG LOAD e DAILY AGG RELOAD procedimento. Incluir um AGG CHECK INTERVAL e AGG CHECK DAILY procedimento que o ajudará a dormir bem à noite. Ah, e sem mencionar uma AGG DATA HOLE CHECK ou uma MISSING AGG DATA CHECK e aplicar regras de negócios que implementam a verificação de uma quantidade mínima necessária de dados que você pode obter da tabela agregada ou da tabela principal ou tabela de preparo (de preferência)

  • Claro, nunca modifique o AGG tabela. Sempre apenas recarregue-o.

  • Como isso ajuda? Você não precisaria apenas que seus relatórios consultassem o AGG table, que é menor e mais rápida (já que a agregação já foi feita)? Talvez o problema de desempenho venha com o carregamento de intervalo, mas se você estruturar adequadamente sua tabela, seus índices e sua manutenção, deve valer a pena.

  • Onde entra o particionamento? Arquivamento. Depois de um certo tempo (discutir o que é aceitável com sua equipe/chefe/homem superior), você pode arquivar os dados antigos de MAIN . Eu experimentei ter que manter 1 ano de dados no banco de dados de produção. Isso meio que parecia uma chatice, mas como era o pedido do cliente, a empresa não teve escolha a não ser me dar o espaço em disco que eu precisava (esfrega as mãos) e, cara, eu brinquei com isso até conseguir algo rodando decentemente. Devo mencionar que minha experiência foi com o Microsoft SQL Server 2005, e os procedimentos armazenados e o SSIS tornaram isso divertido.

Isso é tudo se você ainda não sabe, e para outros que podem querer considerar opções. Não estou dizendo que você já não conhecia nenhum dos itens acima; Estou apenas afirmando o que consegui fazer antes - considerando que não tinha mais informações para trabalhar em sua postagem, exceto que você tem um processo de consolidação que tentou.