# MANUAL TÉCNICO - TUNING E PERFORMANCE DE BANCOS DE DADOS **Código:** ITGENG 0020/26 | **Classificação:** CONFIDENCIAL **Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}} ## 1. HISTÓRICO DE REVISÃO | Data | Versão | Descrição | Autor | | :--- | :--- | :--- | :--- | | {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves | ## 2. OBJETIVO Guiar a identificação de gargalos (Slow Queries) e aplicar otimizações seguras (Universais) e agressivas (Tailored) para PostgreSQL, MySQL e Redis. --- ## 3. PREPARAÇÃO PROATIVA (MONITORAMENTO) Não espere o problema acontecer. Ative isso AGORA. 1. **MySQL Slow Query Log:** * No `my.cnf`: `slow_query_log = 1`, `long_query_time = 2` (segundos). 2. **Postgres pg_stat_statements:** * Instale a extensão: `CREATE EXTENSION pg_stat_statements;` * Veja as queries mais lentas: `SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;` 3. **Redis Latency Monitor:** * Config: `CONFIG SET latency-monitor-threshold 100` (ms). --- ## 4. OTIMIZAÇÕES UNIVERSAIS (SEGURO PARA TODOS) Alterações de Sistema Operacional (Linux) que beneficiam qualquer DB. ### 1. Swappiness (Evitar Swap) Bancos de dados odeiam Swap. O padrão do Linux (60) é ruim. * **Ação:** Mude para 1 ou 10. * Arquivo `/etc/sysctl.conf`: ```ini vm.swappiness = 10 ``` ### 2. Transparent Huge Pages (THP) - DESATIVAR O THP causa picos de lag no Redis e MongoDB. * **Ação:** Desative no boot (varie conforme distro, geralmente via GRUB ou Systemd service). * Verifique: `cat /sys/kernel/mm/transparent_hugepage/enabled` (Deve estar `[never]`). --- ## 5. TUNING TAILORED (CENÁRIOS ESPECÍFICOS) ### Cenário A: Hardware com MUITA RAM (Cache Heavy) O objetivo é manter o [Working Set] na RAM. * **Postgres (`shared_buffers`):** Defina como 25% a 40% da RAM Total. * **MySQL (`innodb_buffer_pool_size`):** Defina como 70-80% da RAM Total (Se o servidor for dedicado apenas ao DB). ### Cenário B: Aplicação Write-Heavy (Muita Escrita) O gargalo é o disco (I/O). * **Postgres:** Aumente `max_wal_size` (ex: 4GB) para reduzir checkpoints frequentes. * **Redis:** Evite `AOF everysec` se puder tolerar perda de 1s. Use persistência mista (RDB + AOF). --- ## 6. DIAGNÓSTICO DE QUERIES (EXPLAIN) O desenvolvedor diz que "o banco está lento". Prove que é a query. 1. Pegue a query lenta no log. 2. Rode com `EXPLAIN` (MySQL) ou `EXPLAIN ANALYZE` (Postgres). ```sql EXPLAIN ANALYZE SELECT * FROM pedidos WHERE data < '2023-01-01'; ``` 3. **Analise:** * **Seq Scan:** Leu a tabela inteira do inicio ao fim. **RUIM**. Falta índice. * **Index Scan:** Usou o índice. **BOM**. ## 7. VALIDAÇÃO FINAL - [ ] O Swappiness está baixo (1-10)? - [ ] Slow Query Log está capturando consultas lentas? - [ ] Índices foram criados para eliminar "Seq Scans" críticos?