O que é “estratégia de indexação” no dia a dia
Estratégia de indexação é um jeito organizado de decidir quais índices criar, por quê, para qual consulta e como manter isso saudável ao longo do tempo. Em ambientes reais, índices surgem por pressão (um endpoint lento, um relatório que estoura o SLA, um filtro novo no produto). Sem método, o banco acumula índices redundantes, caros para escrita e difíceis de evoluir.
Uma estratégia prática se apoia em três pilares: priorização (atacar o que dói mais), padronização (criar e nomear índices de forma consistente) e evolução segura (revisar, ajustar e remover sem quebrar desempenho).
1) Priorização: comece pelas consultas críticas
Como identificar o que é “crítico”
- Endpoints com SLA (ex.: “/checkout”, “/login”, “/search”).
- Relatórios recorrentes (fechamento diário, dashboards executivos).
- Operações em lote (jobs noturnos, sincronizações).
- Consultas com alta frequência mesmo que “não tão lentas” (pequenas melhorias geram grande impacto).
Passo a passo prático: mapa de consultas por impacto
- Liste os principais fluxos (endpoints e relatórios) e associe a cada um: frequência, tempo médio, p95/p99, e impacto no negócio.
- Escolha um top 5–10 para atacar primeiro (não tente indexar “o sistema inteiro”).
- Para cada item, registre a consulta principal (ou conjunto de consultas) que mais pesa.
- Defina um objetivo mensurável (ex.: reduzir p95 de 800ms para 200ms; reduzir tempo do relatório de 3min para 30s).
| Item | Tipo | Frequência | Meta | Consulta-alvo |
|---|---|---|---|---|
| /orders?status=…&from=… | Endpoint | Alta | p95 < 150ms | Q_ORDERS_01 |
| Relatório de faturamento | Relatório | Diária | < 20s | Q_BILLING_03 |
2) Mapeie endpoints/relatórios para consultas reais
Um erro comum é criar índice “por intuição” sem amarrar a uma consulta específica. Em produção, um endpoint pode disparar várias queries; um relatório pode ter variações por parâmetro. O objetivo aqui é transformar “páginas lentas” em uma lista de consultas-alvo.
Passo a passo prático: inventário de consultas-alvo
- Para cada endpoint/relatório, capture as queries executadas (logs, APM, ou instrumentação da aplicação).
- Normalize a query (mesma estrutura, parâmetros variando) e dê um identificador (ex.:
Q_ORDERS_01). - Guarde exemplos de parâmetros representativos (valores comuns e valores extremos).
- Registre o padrão de acesso: filtros, ordenação, paginação, joins e colunas retornadas.
Q_ORDERS_01 (endpoint: GET /orders) Filtros: tenant_id, status, created_at range Ordenação: created_at DESC Paginação: LIMIT/OFFSET Colunas: id, created_at, total3) Associe cada índice a uma consulta-alvo (índice com “dono”)
Todo índice deveria ter um “dono”: uma consulta-alvo (ou um pequeno grupo) que justifica sua existência. Isso reduz acúmulo e facilita decidir se um índice pode ser alterado ou removido.
Modelo de documentação (curto e útil)
- Nome do índice (padronizado)
- Tabela
- Consulta-alvo (ID e link/arquivo)
- Motivo (qual gargalo resolve)
- Padrão de uso (filtros/ordenação)
- Riscos (impacto em escrita, storage, lock/tempo de criação)
- Data e responsável
IDX_orders_tenant_status_createdat_desc Tabela: orders Dono: Q_ORDERS_01 Motivo: reduzir p95 do endpoint /orders Uso: WHERE tenant_id=? AND status=? AND created_at BETWEEN ? AND ? ORDER BY created_at DESC Riscos: aumenta custo de INSERT/UPDATE em orders; cresce ~X GB/mês Criado em: 2026-01-10 Responsável: time backend4) Padronização: nomes, convenções e consistência
Padronização evita “índices órfãos” e facilita auditoria. Uma convenção simples já ajuda muito.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
Convenção de nome (exemplo)
IDX_{tabela}_{col1}_{col2}_{col3}__{uso}
__filter,__sort,__report,__unique(sufixo opcional para intenção)- Se houver direção de ordenação relevante, inclua no sufixo:
__sort_desc
Checklist de padronização
- Todo índice tem consulta-alvo registrada.
- Todo índice tem intenção explícita (filtro, ordenação, relatório, integridade).
- Evite criar índices “genéricos” sem dono (“vai que ajuda”).
- Registre quando revisar (ex.: a cada 30/60/90 dias).
5) Evitando redundâncias: prefixos e sobreposição
Redundância típica: criar um índice que é prefixo de outro já existente, ou criar dois índices que competem pelo mesmo padrão de consulta. Isso aumenta custo de escrita e armazenamento sem ganho proporcional.
Entendendo redundância por prefixo (na prática)
Se você já tem um índice em (tenant_id, status, created_at), muitas vezes um índice separado em (tenant_id, status) pode ser redundante, porque o índice maior pode atender consultas que filtram apenas pelo prefixo. Porém, isso não é uma regra absoluta: pode haver motivos para manter o menor (tamanho, cache, diferenças de ordenação, colunas incluídas, seletividade em cenários específicos).
Passo a passo prático: auditoria de redundância
- Liste os índices por tabela e ordene por “começo” (primeiras colunas).
- Agrupe por prefixo: índices que começam com as mesmas colunas.
- Compare donos: se dois índices servem a mesma consulta-alvo, suspeite de redundância.
- Decida consolidar: prefira um índice que atenda mais de uma consulta-alvo, desde que não piore escrita/armazenamento além do aceitável.
| Índice | Colunas | Dono | Observação |
|---|---|---|---|
| IDX_orders_tenant_status | (tenant_id, status) | Q_ORDERS_01 | Possível prefixo de outro |
| IDX_orders_tenant_status_createdat | (tenant_id, status, created_at) | Q_ORDERS_01 | Pode substituir o anterior |
Sinais de que um índice “prefixo” pode continuar existindo
- O índice maior ficou grande demais e o menor tem melhor cache hit para consultas muito frequentes.
- O índice menor é único (garante integridade) e o maior não.
- O índice maior tem colunas extras que aumentam muito o custo de manutenção, e a consulta-alvo só precisa do prefixo.
- Há diferenças de ordenação (asc/desc) ou de “colunas incluídas” (quando o banco suporta) que mudam o custo.
6) Evolução segura: lidando com novos filtros e ordenações
Requisitos mudam: produto adiciona filtro por channel, ordenação por total, ou um relatório passa a segmentar por region. A estratégia segura é tratar isso como mudança controlada, não como “criar índice e torcer”.
Passo a passo prático: quando surge um novo filtro
- Identifique a consulta-alvo nova (ou a variação da existente) e dê um ID (ex.:
Q_ORDERS_07). - Verifique se algum índice atual já atende (mesmo que parcialmente).
- Decida entre ajustar um índice existente vs criar outro: ajuste quando o índice tem o mesmo “dono” e a mudança é evolução natural; crie outro quando a nova consulta tem padrão diferente e o ajuste prejudicaria a consulta antiga.
- Planeje rollout: criar índice, validar, depois remover o antigo (se aplicável).
Exemplo de decisão (conceitual)
Antes: consultas filtram por tenant_id e status e ordenam por created_at. Depois: adicionam filtro por channel. Opções:
- Evoluir o índice existente para incluir
channelse a maioria das consultas passou a usar esse filtro e ele é estável. - Criar um índice alternativo se apenas uma parte pequena do tráfego usa
channele você não quer penalizar escrita/armazenamento para todos.
Quando muda a ordenação
- Se a ordenação nova virou padrão do endpoint, trate como evolução do “dono”.
- Se a ordenação é opcional (parâmetro
sort=), evite criar um índice para cada combinação; priorize as ordenações mais usadas e com maior impacto.
7) Revisão periódica: índices também envelhecem
Mesmo com boa intenção, índices podem ficar obsoletos: endpoints mudam, relatórios deixam de existir, filtros são removidos, e o padrão de dados muda. Revisão periódica reduz custo de escrita e simplifica o esquema.
Passo a passo prático: rotina de revisão (mensal ou trimestral)
- Liste índices sem “dono” documentado e trate como suspeitos.
- Liste índices com dono, mas cujo endpoint/relatório foi descontinuado.
- Procure sobreposição (prefixos e índices muito parecidos).
- Marque candidatos à remoção e planeje teste de regressão (conceitual) antes de dropar.
- Registre decisões: removido, mantido (por quê), ou consolidado.
8) Guia de validação antes e depois (segurança operacional)
A) Impacto em escrita (INSERT/UPDATE/DELETE)
Ao propor um índice, valide o custo adicional na escrita, principalmente em tabelas “quentes” (muitas inserções/atualizações).
- Checklist: a tabela recebe muitas escritas? as colunas do índice mudam com frequência? há operações em lote?
- Heurística prática: quanto mais índices e quanto mais largos (muitas colunas), maior o custo de manutenção.
B) Crescimento de armazenamento
Índices ocupam espaço e crescem com a tabela. Antes de criar, estime:
- Quantas linhas por dia/mês a tabela cresce.
- Se o índice inclui colunas grandes (mesmo que não sejam “grandes” individualmente, somam).
- Se haverá múltiplos índices parecidos (crescimento duplicado).
Registre uma estimativa simples no ticket/documentação do índice: “esperado crescer ~X por mês” (mesmo que seja aproximação).
C) Testes de regressão conceituais (antes de remover ou alterar)
Teste de regressão aqui significa garantir que você não vai piorar consultas importantes ao mexer em índices.
- Regressão por dono: para cada índice candidato a mudança/remoção, rode (ou simule) as consultas-alvo associadas.
- Regressão por vizinhança: procure consultas parecidas (mesma tabela e mesmos filtros iniciais) que podem estar “se apoiando” no índice sem documentação.
- Regressão por horário: valide em cenários de pico (dados e concorrência mais próximos do real).
Checklist de regressão (conceitual) para remover IDX_X: 1) Rodar Q_... do dono com parâmetros comuns e extremos 2) Rodar endpoints relacionados (mesma tabela) 3) Comparar tempo/p95 e volume de leituras 4) Se piorar, reverter ou ajustar estratégia9) Regras práticas para iniciantes aplicarem com segurança
- Regra 1: índice sem consulta-alvo não entra. Sempre associe a um endpoint/relatório e a uma query identificada.
- Regra 2: um índice deve ter intenção documentada (qual filtro/ordenação ele atende e qual meta melhora).
- Regra 3: priorize o top de impacto. Comece pelos fluxos críticos e mais frequentes.
- Regra 4: evite duplicar por ansiedade. Antes de criar, verifique prefixos e sobreposição com índices existentes.
- Regra 5: mudanças de requisito pedem decisão explícita: evoluir índice existente (mesmo dono) ou criar novo (padrão diferente).
- Regra 6: valide o “custo total”: ganho na leitura vs impacto em escrita e armazenamento.
- Regra 7: toda remoção exige regressão: teste consultas do dono e consultas vizinhas antes de dropar.
- Regra 8: revise periodicamente. Índices envelhecem; mantenha uma rotina de auditoria.
- Regra 9: padronize nomes para facilitar manutenção e comunicação entre times.
- Regra 10: prefira poucos índices bem justificados a muitos índices “talvez úteis”.