Estratégia de Indexação no Dia a Dia: Priorização, Padronização e Evolução Segura

Capítulo 14

Tempo estimado de leitura: 9 minutos

+ Exercício

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

  1. 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.
  2. Escolha um top 5–10 para atacar primeiro (não tente indexar “o sistema inteiro”).
  3. Para cada item, registre a consulta principal (ou conjunto de consultas) que mais pesa.
  4. Defina um objetivo mensurável (ex.: reduzir p95 de 800ms para 200ms; reduzir tempo do relatório de 3min para 30s).
ItemTipoFrequênciaMetaConsulta-alvo
/orders?status=…&from=…EndpointAltap95 < 150msQ_ORDERS_01
Relatório de faturamentoRelatórioDiária< 20sQ_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

  1. Para cada endpoint/relatório, capture as queries executadas (logs, APM, ou instrumentação da aplicação).
  2. Normalize a query (mesma estrutura, parâmetros variando) e dê um identificador (ex.: Q_ORDERS_01).
  3. Guarde exemplos de parâmetros representativos (valores comuns e valores extremos).
  4. 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, total

3) 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 backend

4) Padronização: nomes, convenções e consistência

Padronização evita “índices órfãos” e facilita auditoria. Uma convenção simples já ajuda muito.

Continue em nosso aplicativo e ...
  • Ouça o áudio com a tela desligada
  • Ganhe Certificado após a conclusão
  • + de 5000 cursos para você explorar!
ou continue lendo abaixo...
Download App

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

  1. Liste os índices por tabela e ordene por “começo” (primeiras colunas).
  2. Agrupe por prefixo: índices que começam com as mesmas colunas.
  3. Compare donos: se dois índices servem a mesma consulta-alvo, suspeite de redundância.
  4. Decida consolidar: prefira um índice que atenda mais de uma consulta-alvo, desde que não piore escrita/armazenamento além do aceitável.
ÍndiceColunasDonoObservação
IDX_orders_tenant_status(tenant_id, status)Q_ORDERS_01Possível prefixo de outro
IDX_orders_tenant_status_createdat(tenant_id, status, created_at)Q_ORDERS_01Pode 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

  1. Identifique a consulta-alvo nova (ou a variação da existente) e dê um ID (ex.: Q_ORDERS_07).
  2. Verifique se algum índice atual já atende (mesmo que parcialmente).
  3. 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.
  4. 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 channel se 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 channel e 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)

  1. Liste índices sem “dono” documentado e trate como suspeitos.
  2. Liste índices com dono, mas cujo endpoint/relatório foi descontinuado.
  3. Procure sobreposição (prefixos e índices muito parecidos).
  4. Marque candidatos à remoção e planeje teste de regressão (conceitual) antes de dropar.
  5. 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égia

9) 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”.

Agora responda o exercício sobre o conteúdo:

Ao surgir um novo filtro em um endpoint já existente, qual abordagem segue uma evolução segura da estratégia de indexação?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

A evolução segura trata a mudança como controlada: define a consulta-alvo, checa cobertura dos índices atuais, decide ajustar vs criar (sem prejudicar o padrão antigo) e faz rollout com validação, removendo o índice antigo se fizer sentido.

Capa do Ebook gratuito Índices e Performance de Banco de Dados para Iniciantes: Como Acelerar Consultas sem Mistério
100%

Índices e Performance de Banco de Dados para Iniciantes: Como Acelerar Consultas sem Mistério

Novo curso

14 páginas

Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.