Áreas de Memória no MySQL: Como Configurar Corretamente

Uma correta configuração das áreas de memória é um dos pilares da performance em qualquer banco de dados. Um ambiente com uma memória subdimensionada pode apresentar lentidões e alto impacto de IO de disco. Enquanto uma super alocação da memória pode também ocasionar instabilidades e erros de out of memory (falta de memória para os processos em execução).

1. Visão Geral: Tipos de Alocação de Memória

O MySQL aloca a memória em dois principais grupos, a memória global (compartilhada) e a memória por thread (por conexão). Essa separação é essencial e impacta diretamente no consumo de memória do servidor e no comportamento 

Memória Global (Global Memory): é alocada uma única vez, no momento em que o serviço do MySQL é iniciado. 

Exemplos:
  • innodb_buffer_pool_size: cache de dados e índices do InnoDB.
  • key_buffer_size: cache para índices MyISAM.
  • table_open_cache: cache de descritores de tabela.
  • query_cache_size (obsoleto a partir do MySQL 8.0).
Características:: 
  • Não cresce com o número de conexões
  • Ideal para definir proporcionalmente à RAM total
  • Garante performance em acesso a disco e leitura de dados
Memória por Thread (Thread/Connection Memory): é alocada individualmente para cada sessão ativa. Desta forma, quando maior o número de conexões simultâneas, maior será o consumo total.

Exemplos:
  • sort_buffer_size: buffer para ordenações
  • read_buffer_size: buffer para leitura sequencial
  • join_buffer_size: buffer para joins sem índice
  • tmp_table_size: limite para criação de tabelas temporárias em RAM
  • net_buffer_length, max_allowed_packet
Características:
  • Multiplicada por max_connections
  • Pode gerar consumo excessivo de memória se mal configurada
  • Afeta diretamente a escalabilidade

2. Principais Áreas de Memória

  •  InnoDB Buffer Pool (innodb_buffer_pool_size)
Função: Armazena dados e índices do InnoDB em memória e reduz leituras em disco, acelerando consultas.

Recomendação: 60% a 80% da RAM total, em servidores dedicados apenas ao MySQL. Para ambientes com cargas mistas, ajuste para deixar espaço ao SO e outros serviços.
  • InnoDB Log Buffer (innodb_log_buffer_size)
Função: Armazena modificações em memória antes de serem escritas nos redo logs no disco.

Recomendação: Para cargas com muitas transações pequenas, aumente esse valor. Padrão: 16M, pode ser ajustado para 64M ou mais em sistemas OLTP com alta escrita.
  • Sort Buffer (sort_buffer_size)
Função: Buffer por conexão usado para ordenações (ORDER BY, GROUP BY).

Recomendação: Comece com valores entre 1M a 4M. Cuidado: é alocado por conexão, pode afetar OOM em ambientes com muitas conexões simultâneas.
  • Join Buffer (join_buffer_size)
Função: Usado quando o MySQL precisa realizar joins sem índices apropriados.

Recomendação: Manter entre 1M a 4M por conexão. Se for necessário aumentar muito esse valor, talvez seja hora de rever os índices.
  • Read Buffer (read_buffer_size e read_rnd_buffer_size)
Função: Buffers de leitura para varreduras de tabela.

Recomendação: Usar valores baixos a moderados (ex: 512K a 2M). Como são buffers por conexão, o uso excessivo pode afetar o consumo total de RAM.
  • Tabela Temporária na Memória (tmp_table_size e max_heap_table_size)
Função: Define o limite máximo para que uma tabela temporária seja criada na memória. Ultrapassado o valor, é criada em disco, o que é mais lento.

Recomendação: Mantenha ambos com o mesmo valor, pois o menor prevalece. Aumente se você detectar muitas Created_tmp_disk_tables.
  • Key Buffer (key_buffer_size) — exclusivo MyISAM
Função: Cache de índices das tabelas MyISAM.

Recomendação: Se não usa MyISAM, mantenha um valor pequeno. Se usa MyISAM ativamente, considere valores maiores, até 25% da RAM disponível.
  • Table Cache (table_open_cache e table_definition_cache)
Função: Cache de descritores de tabela abertos, evita overhead de abertura repetida.

Recomendação: Ajustar conforme o número de tabelas ativas e consultas concorrentes. Use SHOW STATUS LIKE 'Opened_tables'; para avaliar.

ATENÇÃO: Antes de ajustar qualquer parâmetro de memória.
  • Verifique as variáveis ativas (SHOW VARIABLES)
  • Analise o comportamento do banco (SHOW STATUS)
  • Monitore o sistema operacional
  • Use ferramentas como o Performance Schema e mysqltuner
Esses passos evitam o risco de causar um OOM (Out of Memory) e ajudam a garantir que cada byte de RAM esteja sendo usado com inteligência.

Comentários