Para a consulta a seguir, tenho um índice de cobertura da seguinte forma:
SELECT bar_id FROM foo WHERE user_id=:user_id AND date_sent=:date_sent;
ALTER TABLE foo ADD INDEX (user_id, date_sent, bar_id);
Agora tenho outra consulta para a qual gostaria de adicionar um índice de cobertura:
SELECT user_id FROM foo WHERE bar_id=:bar_id AND date_sent=:date_sent;
O índice de cobertura anterior também cobre esta nova consulta? Quando executo EXPLAIN
a nova consulta, a seguinte saída é retornada:
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------+
| 1 | SIMPLE | foo | ref | bar_id | bar_id | 4 | const | 5 | NULL |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------+
Vejo que a chave mencionada é bar_id
, mas isso me parece mostrar que este não é um índice de cobertura . Além disso, o Extra
campo não mostra a Using index
saída esperada que me garantiria que um índice de cobertura está em uso.
O índice está cobrindo a segunda consulta. No entanto, não é ÚTIL apoiar a busca. Porque nem
bar_id
nemdate_sent
está liderando o índice, o otimizador não pode procurá-lo.O que você conseguiu com o índice de cobertura é tornar a verificação da tabela mais rápida para a segunda consulta. Mas você não apoiou uma estratégia de busca melhor.
Este índice de cobertura ajudaria ambas as consultas:
Ou se você priorizar a segunda consulta: