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


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:

SQL
SELECT * FROM users WHERE email = 'alice@email.com';
-- Execution time: 2.5 seconds (Full Table Scan)

(2) Soluções para índices

SQL
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+

100%
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

SQL
-- 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));
▶ Experimente

5. Visualizar o Índice

▶ Exemplo: Visualização das informações do índice

SQL
-- View all indexes on the table
SHOW INDEX FROM users;

-- View Index Information
SHOW INDEX FROM users\G
▶ Experimente

Saída:

TEXT 📖 Somente leitura
+-------+------------+----------+--------------+-------------+
| 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

SQL
-- 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;
▶ Experimente

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 EXPLAIN para 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


📝 Exercícios

  1. Questão básica (Dificuldade ⭐): Crie um índice único no campo email da tabela users.

  2. Problema avançado (Dificuldade ⭐⭐): Crie um índice composto (department, salary) e verifique o princípio do prefixo mais à esquerda.

  3. Questão desafiadora (Dificuldade: ⭐⭐⭐): Use EXPLAIN para comparar as diferenças de desempenho entre consultas com e sem índices.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%