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.