Como otimizei um problema de desempenho de um sistema na empresa.
Na empresa temos um sistema que gera em torno de 50 milhões de registros no banco de dados por dia.
Esses registros precisam ficar guardados por 1 ano.
Então temos 50 milhões x 365(6) dias, o que nos dá aproximadamente 18 BILHÕES de registros.
Fui chamado pra ver se conseguiria otimizar esse sistema porque as consultas estavam extremamente lentas.
Para se ter uma idéia, uma simples busca estava demorando várias horas para entregar os resultados.
O sistema utilizava o Postgres como SGBD.
O sistema grava os dados de madrugada.
Os usuários acessam o sistema durante o dia.
Não há relacionamentos entre as tabelas.
Não há escritas quando os usuários estão fazendo as consultas.
A empresa mantém os arquivos com os dados brutos, que geram os dados para o banco.
Com base no explicado acima, decidi por utilizar o MariaDB com a tabela de dados usando a engine MyISAM.
Só com essa mudança, consultas que demoravam horas, passaram a ser executadas em uns 30 minutos.
Mas eu ainda não fiquei satisfeito.
Me reuni com os usuários do sistema e elegemos quais colunas são mais utilizadas nas buscas, desse modo as adicionei como índices.
Com essa mudança as consultas parassaram a ser executas em 3 a 5 minutos.
Mas eu ainda não fiquei satisfeito.
Conversando mais com os usuários, descobri que eles sempre selecionavam a data em que precisavam dos dados.
Então pensei: "Vou dividir para conquistar".
Criei 366 bancos dentro do SGBD, um pra cada dia do ano, e fiz um roteamento no sistema para selecionar o banco correto para leitura/escrita dos dados.
Agora as consultas não ocorrem em um unverso de 18 bilhões de registros, mas em "apenas" 50 milhões.
Com isso as consultas agora retornam em menos de 1 segundo quando se utiliza alguma coluna indexada.
Quando se busca em uma coluna não indexada as consultas demoram em torno de 20 a 30 segundos
Então sugeri aos usuários que, mesmo que precisem buscar dados nas colunas não indexadas, adicionem pelo menos uma coluna indexada na busca.
Com isso resolvi o problema de desempenho do sistema que demovara horas para executar uma busca para resultados instantâneos.