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 repetivas. 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. Fiz algumas contas e constatei que gastava menos de 0,1 segundos em cada QUERY (nada mal). Mas algo tinha que ser feito!

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 é imcomparável quando o assunto é velocidade.

Algumas 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 uma STORE PROCEDURE que replica algumas informalções de uma tabela normal (MYSAM, por exemplo) para uma MEMORY, melhorando o desempenho daquela QUERY complexa.

Ainda neste semana, vou apresentar um tutorial de como criar uma tabela MEMORY com o PHP, replicando as informações de outra tabela. Não percam!!!

PHP – Classe para calcular Erlang B

No dia a dia do meu trabalho, me deparo sempre com a necessidade de calcular a capacidade (Erlg) de tráfego de uma interface. Assim, acabo sempre recaindo na necessidade de saber quantos Erlangs determinada interface possui, ou mesmo saber quanto terá depois de alguma atividade.

Tradicionalmente recorremos à alguma tabela de referência (exatamente como faziam na década de 60) ou utilizamos um dos inúmeros softwares que fazem este trabalho para você (para acesso web, indico o site www.erlang.com). Mas eu queria mais. Queria controlar esta atividade, podendo:

  • Fazer o cálculo dentro do meu próprio código;
  • Popular uma tabela de um banco de dados,
  • Mostrar o código no meu blog ;-)

Então, como um bom engenheiro que sou ;-) , criei um código (uma classe) em PHP para calcular Erlang B…
Continue lendo: PHP – Classe para calcular Erlang B