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
Postar um comentário