Í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.

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:
cpfsim,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
- MySQL e MariaDB lentos? 12 causas comuns (e como resolver)
- Como fazer um health check completo no MySQL e MariaDB
- MySQL e MariaDB travando? Entenda locks e deadlocks
- Como otimizar o InnoDB buffer pool no MySQL e MariaDB
- Como encontrar queries lentas no MySQL e MariaDB
- Índices no MySQL e MariaDB: quando criar e quando remover
- Consultoria MySQL e MariaDB: quando vale a pena contratar um DBA especializado?
- DBA remoto para MySQL e MariaDB: como funciona?
- Assessment MySQL e MariaDB: o que é avaliado?
- Backup e disaster recovery no MySQL e MariaDB
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).