MySQL – Melhorando o desempenho com tabelas MEMORY

Quem já teve que trabalhar com grandes volumes de dados no MySQL, já se perguntou como melhorar o desempenho de consultas longas e repetitivas. E sabe como é difícil.Este post nasceu de várias perguntas que me fiz enquanto procurava o gargalo em um sistema de verificação de inconsistências que gastava 5 horas analisando as mesmas tabelas.O Pensador

Imaginar como melhorar o desempenho de um JOIN de campos CHAR entre três tabelas, uma com 200k linhas, outra com 5k linhas e outra com 50 linhas não é fácil. A primeira saída é otimizar o banco, com a criação de índices e adequação dos campos ao conteúdo (INT, CHAR, VARCHAR, …). Mas mesmo assim não estava funcionando no meu caso. Nada que uma visita na documentação do MySQL não resolva os problemas.

Na documentação descobri que exatamente para estes casos o MySQL possui um tipo especial de tabela, o MEMORY. Ela possui algumas limitações, porém é incomparável quando o assunto é velocidade.

As limitações:

  • Não suporta campos do tipo BLOB e TEXT (mais uma desculpa para otimizar o banco);
  • Os registros ocupam um tamanho fixo na memória. Assim, um campo INT vai sempre ocupar 4 bytes de memória, mesmo que você o use como um TINYINT;
  • Você precisa de muita memória RAM disponível no servidor (devido ao caso acima);

Como você pode precisar de uma quantidade de memoria RAM absurda, o MySQL limita a quantidade de memória até o valor definido na variável max_heap_table_size. O valor default é 16Mb, mas o céu é o limite.

Apesar de possível, não é recomendada a utilização de uma tabela MEMORY para armazenar dados pois as informações serão perdidas em caso de falta de energia. Considere sua utilização apenas em casos onde:

  • Você tenha muitas pesquisas em um curto espaço de tempo;
  • Os dados sejam estáticos, sem variações (nada de UPDATES)

É uma boa pedida para aquela rotina demorada que roda toda madrugada.