Resumo : neste tutorial, você aprenderá como usar a USE INDEX
dica do MySQL para instruir o otimizador de consulta a usar apenas uma lista de índices nomeados para uma consulta.
Introdução à dica USE INDEX do MySQL
No MySQL, quando você envia uma consulta SQL ao servidor de banco de dados, o otimizador de consulta tenta criar um plano de execução de consulta ideal.
Para determinar o melhor plano possível, o otimizador de consulta depende de vários parâmetros. Um dos parâmetros mais cruciais para selecionar o índice apropriado é a distribuição de chaves armazenadas , também conhecida como cardinalidade .
A cardinalidade, entretanto, pode não ser precisa. Por exemplo, se a tabela tiver sido muito modificada com muitas inserções ou exclusões, a cardinalidade não será atualizada em tempo hábil.
Para resolver esse problema, você deve executar a ANALYZE TABLE
instrução periodicamente para atualizar a cardinalidade.
Além disso, o MySQL permite recomendar os índices que o otimizador de consulta deve considerar usando uma dica de índice.
Aqui está a sintaxe básica para usar a USE INDEX
dica:
SELECT select_list
FROM table_name USE INDEX(index_list)
WHERE condition;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe, USE INDEX
instrui o otimizador de consulta a usar um dos índices nomeados para localizar linhas na tabela.
Observe que quando você recomenda os índices a serem usados, o otimizador de consulta pode decidir usá-los ou não, dependendo do plano de consulta apresentado.
Exemplo de USE INDEX do MySQL
Usaremos a tabela de clientes do banco de dados de exemplo para demonstração:
Primeiro, use a SHOW INDEXES
instrução para exibir todos os índices da customers
tabela:
SHOW INDEXES FROM customers;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Em segundo lugar, crie quatro índices da seguinte forma:
CREATE INDEX idx_c_ln ON customers(contactLastName);
CREATE INDEX idx_c_fn ON customers(contactFirstName);
CREATE INDEX idx_name_fl ON customers(contactFirstName,contactLastName);
CREATE INDEX idx_name_lf ON customers(contactLastName,contactFirstName);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, encontre clientes cujo nome ou sobrenome do contato comece com a letra A. Use a EXPLAIN
instrução para verificar quais índices são usados:
EXPLAIN SELECT *
FROM
customers
WHERE
contactFirstName LIKE 'A%'
OR contactLastName LIKE 'A%'\G
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O seguinte mostra a saída da instrução:
id: 1
select_type: SIMPLE
table: customers
partitions: NULL
type: index_merge
possible_keys: idx_c_ln,idx_c_fn,idx_name_fl,idx_name_lf
key: idx_c_fn,idx_c_ln
key_len: 52,52
ref: NULL
rows: 16
filtered: 100.00
Extra: Using sort_union(idx_c_fn,idx_c_ln); Using where
1 row in set, 1 warning (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A saída indica que o otimizador de consulta usou os índices idx_c_fn
e idx_c_ln
.
Quarto, se você acha que é melhor usar os índices idx_c_fl
e idx_c_lf
, use a USE INDEX
cláusula da seguinte maneira:
EXPLAIN SELECT *
FROM
customers
USE INDEX (idx_name_fl, idx_name_lf)
WHERE
contactFirstName LIKE 'A%'
OR contactLastName LIKE 'A%'\G
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que isso é apenas para fins de demonstração, mas não é a melhor escolha.
O seguinte ilustra a saída:
id: 1
select_type: SIMPLE
table: customers
partitions: NULL
type: index_merge
possible_keys: idx_name_fl,idx_name_lf
key: idx_name_fl,idx_name_lf
key_len: 52,52
ref: NULL
rows: 16
filtered: 100.00
Extra: Using sort_union(idx_name_fl,idx_name_lf); Using where
1 row in set, 1 warning (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Estas são as mudanças:
- A
possible_keys
coluna lista apenas os índices especificados naUSE INDEX
cláusula. - A coluna chave tem ambos
idx_name_fl
eidx_name_lf
. Isso significa que o otimizador de consulta usou os índices recomendados.
Pode USE INDEX
ser útil se o otimizador de consulta usar o índice errado da lista de índices possíveis.
Resumo
- Use a
USE INDEX
dica do MySQL para instruir o otimizador de consulta a usar a única lista de índices especificados.