Esta é uma deficiência conhecida no MySQL.
Muitas vezes é verdade que usar
UNION
tem um desempenho melhor do que uma consulta de intervalo como a que você mostra. MySQL não emprega índices de forma muito inteligente para expressões usando IN (...)
. Existe um buraco semelhante no otimizador para expressões booleanas com OR
. Veja http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ para algumas explicações e benchmarks detalhados.
O otimizador está sendo aprimorado o tempo todo. Uma deficiência em uma versão do MySQL pode ser melhorada em uma versão subsequente. Portanto, vale a pena testar suas consultas em diferentes versões.
Também é vantajoso usar
UNION ALL
em vez de simplesmente UNION
. Ambas as consultas usam uma tabela temporária para armazenar resultados, mas a diferença é que UNION
aplica DISTINCT
ao conjunto de resultados, que incorre em uma classificação não indexada adicional.