← Voltar ao blog
MySQL 5 min de leitura

Índices no MySQL e MariaDB: quando criar e quando remover

Índice certo acelera; índice demais pesa na escrita. Veja como decidir no MySQL e no MariaDB.

Índices no MySQL e MariaDB: quando criar e quando remover

Um índice é o fichário da biblioteca: em vez de olhar livro por livro, você vai direto à gaveta certa. Mas imagine uma biblioteca com vinte fichários diferentes, e cada livro novo precisando ser cadastrado nos vinte. É o que acontece quando se cria índice por impulso no MySQL ou no MariaDB.

Resumo rápido: Índice certo acelera; índice demais pesa na escrita. Veja como decidir no MySQL e no MariaDB.

Série MySQL e MariaDB na prática: comandos válidos para MySQL 8.x e MariaDB 10.6+/11.x, com as diferenças indicadas quando existem.

Como o índice funciona (B-tree)

                 [ M ]
              /         \
        [ D | H ]      [ R | V ]
        /   |   \       /  |  \
     A-C  E-G  I-L   N-Q S-U W-Z  → folhas apontam para a chave primária
Busca por "Silva": 3 saltos em vez de ler milhões de linhas

No InnoDB, a tabela é organizada pela chave primária (índice clusterizado). Índices secundários guardam a coluna indexada mais a PK. Por isso, PK enorme (UUID em texto, por exemplo) engorda todos os outros índices.

Quando criar

  • Colunas em WHERE, JOIN e ORDER BY de consultas frequentes.
  • Chaves estrangeiras (o InnoDB exige; crie mesmo assim nas tabelas filhas).
  • Colunas com boa seletividade: cpf sim, ativo (S/N) sozinho raramente.

Índice composto: a ordem importa

CREATE INDEX idx_cli_status_data ON pedidos (cliente_id, status, criado_em);

-- Usa o índice (prefixo da esquerda):
WHERE cliente_id = 42
WHERE cliente_id = 42 AND status = 'aberto'
WHERE cliente_id = 42 AND status = 'aberto' ORDER BY criado_em DESC
-- Não usa bem:
WHERE status = 'aberto'          -- pulou a primeira coluna

Regra prática: igualdade primeiro, intervalo e ordenação por último.

Índice de cobertura

CREATE INDEX idx_cobre ON pedidos (cliente_id, criado_em, total);
SELECT criado_em, total FROM pedidos WHERE cliente_id = 42;
-- EXPLAIN: "Using index" → respondeu só com o índice, sem tocar na tabela

Quando remover

-- Nunca usados desde o último restart (MySQL e MariaDB com sys schema)
SELECT * FROM sys.schema_unused_indexes;
-- Redundantes: (a) é coberto por (a, b)
SELECT * FROM sys.schema_redundant_indexes;

Antes de apagar, teste esconder. No MySQL 8 há índices invisíveis; no MariaDB 10.6+, índices ignorados:

ALTER TABLE pedidos ALTER INDEX idx_antigo INVISIBLE;  -- MySQL 8
ALTER TABLE pedidos ALTER INDEX idx_antigo IGNORED;    -- MariaDB 10.6+
-- observe por alguns dias; se nada piorar:
DROP INDEX idx_antigo ON pedidos;

O custo do índice

  • Cada INSERT, UPDATE e DELETE atualiza todos os índices envolvidos.
  • Ocupa disco e, principalmente, espaço no buffer pool.
  • Estatísticas de "nunca usado" zeram no restart e ignoram relatórios mensais. Olhe um ciclo completo de negócio antes de decidir.

A série completa: MySQL e MariaDB na prática

Precisa de ajuda especializada?

Se o seu ambiente MySQL ou MariaDB precisa de diagnóstico, otimização, backup confiável ou acompanhamento contínuo, conheça a HTI Tecnologia, especialista em bancos de dados.

Ainda decidindo entre os dois? Leia MySQL ou MariaDB: qual é o melhor? e o guia definitivo de MySQL.

Quer dominar a base que os dois compartilham?

MariaDB nasceu do MySQL, e tudo o que é fundamento (modelagem, índices, transações, replicação, otimização) vale para os dois. É isso que eu ensino no livro Aprendendo MySQL: Prática, Teoria, Laboratórios, Desafios e Projetos: 292 páginas, 10 laboratórios guiados, 277 exercícios e 4 desafios com gabarito, e uma máquina virtual pronta para você quebrar (e consertar) à vontade.

Conheça o livro e leia a degustação gratuita.

Bora trocar ideia?

Se este artigo te ajudou (ou te fez discordar, que também vale), me siga no LinkedIn e no Instagram. Lá eu posto bastidores de banco de dados, história da computação e histórias de produção que ninguém conta em curso oficial.


Sobre o autor: Alexandre Almeida atua com bancos de dados há mais de 25 anos, foi instrutor oficial de MySQL e Oracle para mais de 1.000 alunos e escreveu Aprendendo MySQL: Prática, Teoria e Laboratórios.

Fontes: MySQL 8.4 Reference Manual (Oracle), MariaDB Server Documentation (MariaDB Knowledge Base), documentação do Percona Toolkit e do Percona XtraBackup. Imagem de capa: ilustração gerada por IA (gaveteiro antigo de fichas de biblioteca com uma gaveta aberta).