Otimizacao de Desempenho do MySQL
Um servidor MySQL mal configurado pode causar lentidao, timeouts e degradacao progressiva do desempenho. Este guia aborda as configuracoes mais impactantes do InnoDB, estrategias de indexacao, analise de consultas lentas e monitoramento para servidores de producao.
Configuracao do Buffer Pool do InnoDB
O buffer pool do InnoDB e a area de memoria mais importante do MySQL. Ele armazena dados de tabelas e indices em cache, reduzindo drasticamente a necessidade de leituras em disco:
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# Buffer pool - 70-80% da RAM em servidores dedicados
innodb_buffer_pool_size = 12G
innodb_buffer_pool_instances = 4
# Log de transacoes
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1
# I/O
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# Conexoes
max_connections = 200
thread_cache_size = 16
table_open_cache = 4096
Apos alterar o my.cnf, reinicie o MySQL e verifique o hit ratio do buffer pool. Um valor abaixo de 99% indica que o buffer pool esta subdimensionado:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
-- Calcular hit ratio
SELECT
(1 - (Reads / Requests)) * 100 AS hit_ratio
FROM (
SELECT
VARIABLE_VALUE AS Reads
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads'
) r, (
SELECT
VARIABLE_VALUE AS Requests
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests'
) rr;
Identificando e Otimizando Consultas Lentas
O slow query log e a principal ferramenta para encontrar consultas problematicas. Habilite-o e use EXPLAIN para analisar planos de execucao:
-- Habilitar slow query log
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = ON;
-- Analisar plano de execucao de uma consulta
EXPLAIN ANALYZE
SELECT o.order_id, c.name, p.product_name
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.id
WHERE o.created_at >= '2026-01-01'
AND c.country = 'BR'
ORDER BY o.created_at DESC
LIMIT 100;
Procure por type: ALL (full table scan) e rows com valores altos na saida do EXPLAIN. Crie indices compostos que cubram as colunas das clausulas WHERE, JOIN e ORDER BY:
-- Indice composto para a consulta acima
CREATE INDEX idx_orders_created_customer
ON orders (created_at, customer_id);
CREATE INDEX idx_customers_country
ON customers (country, id);
Estrategias de Indexacao
Indices bem planejados sao a forma mais eficaz de melhorar o desempenho das consultas. Siga estas diretrizes ao projetar indices:
-- Verificar indices existentes
SELECT
TABLE_NAME, INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX, CARDINALITY
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'mydb'
ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;
-- Identificar indices nao utilizados
SELECT
object_schema, object_name, index_name
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE index_name IS NOT NULL
AND count_star = 0
AND object_schema = 'mydb';
-- Indice covering para evitar acesso a tabela
CREATE INDEX idx_covering_orders
ON orders (customer_id, created_at, status, total_amount);
Evite criar indices redundantes ou duplicados que consomem espaco em disco e tornam operacoes de escrita mais lentas. Use indices de prefixo para colunas VARCHAR longas e considere indices funcionais disponíveis no MySQL 8.0 para expressoes frequentes.
Monitoramento Continuo
Monitorar metricas do MySQL em producao e essencial para identificar degradacao de desempenho antes que afete os usuarios. Configure o Performance Schema e exporte metricas para Grafana:
-- Consultas mais executadas e seu tempo medio
SELECT
DIGEST_TEXT,
COUNT_STAR AS executions,
ROUND(AVG_TIMER_WAIT / 1000000000, 2) AS avg_ms,
ROUND(SUM_TIMER_WAIT / 1000000000000, 2) AS total_seconds
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;
-- Tabelas com mais I/O
SELECT
object_schema, object_name,
count_read, count_write
FROM performance_schema.table_io_waits_summary_by_table
ORDER BY sum_timer_wait DESC
LIMIT 10;
Use ferramentas como Percona Monitoring and Management (PMM) ou o mysqld_exporter do Prometheus para coletar metricas automaticamente e criar dashboards com historico de desempenho.
Resumo
A otimizacao do MySQL e um processo iterativo: configure o buffer pool adequadamente, identifique consultas lentas, crie indices estrategicos e monitore continuamente. Essas praticas garantem que seu servidor MySQL atenda as demandas de producao com desempenho consistente.