MySQL: Noções básicas sobre índices no MySQL
Última atualização: 2026-08-26
Os índices são fundamentais para otimizar o desempenho do banco de dados — uma consulta sem um índice é como procurar uma palavra no dicionário sem consultar o índice.
Esta aula explica os princípios por trás dos índices, bem como a forma de criá-los e gerenciá-los.
1. O que você vai aprender
- O que é um índice e por que precisamos deles?
- Princípios da estrutura do índice B+Tree
- CREATE INDEX / ALTER TABLE: Criar um índice
- Visualizar e excluir índices
- Vantagens e desvantagens dos índices
2. Cenários da vida real
(1) Problema: as consultas são muito lentas
1 milhão de registros de usuários, pesquisa por endereço de e-mail:
SELECT * FROM users WHERE email = 'alice@email.com';
-- Execution time: 2.5 seconds (Full Table Scan)
(2) Soluções para índices
CREATE INDEX idx_email ON users(email);
-- Search again: 0.003 seconds (Index Lookup)
| Dimensão | Sem índice | Com índice |
|---|---|---|
| Método de consulta | Varredura completa da tabela | Pesquisa em árvore B+ |
| Consulta com 1 milhão de linhas | 2–5 segundos | < 0,01 segundos |
| Desempenho de gravação | Sem sobrecarga adicional | Ligeiramente mais lento (requer manutenção de índices) |
3. Como funcionam os índices
(1) Estrutura da árvore B+
graph TB
R[Root Node<br/>10 | 30 | 50] --> L1[1-10]
R --> L2[11-30]
R --> L3[31-50]
R --> L4[51+]
L1 --> D1[Data: 1,3,5,7,9]
L1 --> D2[Data: 2,4,6,8,10]
L2 --> D3[Data: 11,15,20]
L2 --> D4[Data: 25,28,30]
L3 --> D5[Data: 31,35,40]
L3 --> D6[Data: 45,48,50]
(2) Tipos de índices
| Tipo | Descrição | Casos de uso |
|---|---|---|
| Índice B+Tree | Tipo de índice padrão | Igual/Intervalo/Classificado |
| Índice de hash | Tabela de hash | Consulta de igualdade (Memory Engine) |
| Índice de texto completo | Pesquisa de texto | Pesquisa no conteúdo dos artigos |
| Índice espacial | Dados SIG | Consulta de geolocalização |
4. Criação de índices
▶ Exemplo: Criação de um índice
-- Methods1:CREATE INDEX
CREATE INDEX idx_email ON users(email);
-- Unique Index
CREATE UNIQUE INDEX idx_email ON users(email);
-- Methods2:ALTER TABLE
ALTER TABLE users ADD INDEX idx_username (username);
-- Composite Index(Composite Index)
CREATE INDEX idx_name_email ON users(username, email);
-- Prefix Index
CREATE INDEX idx_email_prefix ON users(email(10));
5. Visualizar o Índice
▶ Exemplo: Visualização das informações do índice
-- View all indexes on the table
SHOW INDEX FROM users;
-- View Index Information
SHOW INDEX FROM users\G
Saída:
+-------+------------+----------+--------------+-------------+
| Table | Key_name | Seq_in_index | Column_name | Index_type |
+-------+------------+--------------+-------------+------------+
| users | PRIMARY | 1 | id | BTREE |
| users | idx_email | 1 | email | BTREE |
+-------+------------+--------------+-------------+------------+
6. Exclusão de um índice
▶ Exemplo: Exclusão de um índice
-- Methods1:DROP INDEX
DROP INDEX idx_email ON users;
-- Methods2:ALTER TABLE
ALTER TABLE users DROP INDEX idx_email;
-- Delete Primary Key
ALTER TABLE users DROP PRIMARY KEY;
7. Casos de uso para índices
| Cenário | Deve-se criar um índice? | Motivo |
|---|---|---|
| Campo da condição WHERE | ✅ | Acelerar a consulta |
| Campo de junção | ✅ | Junção acelerada |
| Campo ORDER BY | ✅ | Evitar ordenação |
| Agrupar por campo | ✅ | Agrupamento acelerado |
| Campo altamente seletivo | ✅ | Alta discriminação |
| Atualizações frequentes no campo | ❌ | Altos custos de manutenção |
| Campos de baixa seletividade | ❌ | Como gênero (M/F) |
| Tabelas com pequenas quantidades de dados | ❌ | A varredura completa da tabela é mais rápida |
❓ Perguntas Frequentes
P: É melhor ter mais índices? R: Não. Os índices ocupam espaço e reduzem o desempenho de gravação. Crie índices apenas nos campos que são consultados com frequência.
P: As chaves primárias são indexadas automaticamente? R: Sim. Uma chave PRIMARY KEY cria automaticamente um índice agrupado, e uma chave UNIQUE cria automaticamente um índice exclusivo.
P: Como posso determinar se é necessário um índice? R: Use
EXPLAINpara analisar o plano de consulta e verificar se um índice está sendo utilizado.
P: É melhor ter mais índices? R: Não. Os índices reduzem o desempenho das gravações; por isso, recomenda-se que uma única tabela não tenha mais do que 5 a 6 índices.
P: A chave primária é sempre um índice agrupado? R: No InnoDB, sim — a chave primária é um índice agrupado. No MyISAM, a chave primária é um índice não agrupado.
📖 Resumo
- Índices aceleram as consultas, mas reduzem o desempenho de gravação
- A B+Tree é a estrutura de índice padrão, que suporta correspondências exatas, consultas por intervalo e consultas ordenadas.
- CREATE INDEX para criar, DROP INDEX para excluir
- Aplicável a: campos WHERE/JOIN/ORDER BY/GROUP BY
- Não se aplica: atualizações frequentes, baixa seletividade, tabelas pequenas
📝 Exercícios
-
Questão básica (Dificuldade ⭐): Crie um índice único no campo
emailda tabelausers. -
Problema avançado (Dificuldade ⭐⭐): Crie um índice composto
(department, salary)e verifique o princípio do prefixo mais à esquerda. -
Questão desafiadora (Dificuldade: ⭐⭐⭐): Use
EXPLAINpara comparar as diferenças de desempenho entre consultas com e sem índices.