Esta es una deficiencia conocida en MySQL.
A menudo es cierto que usar UNION
funciona mejor que una consulta de rango como la que muestra. MySQL no emplea índices de manera muy inteligente para expresiones que usan IN (...)
. Existe un agujero similar en el optimizador para expresiones booleanas con OR
.
Consulte http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ para obtener alguna explicación y puntos de referencia detallados.
El optimizador se está mejorando todo el tiempo. Una deficiencia en una versión de MySQL puede mejorarse en una versión posterior. Por lo tanto, vale la pena probar sus consultas en diferentes versiones.
También es ventajoso usar UNION ALL
en lugar de simplemente UNION
. Ambas consultas usan una tabla temporal para almacenar resultados, pero la diferencia es que UNION
aplica DISTINCT
al conjunto de resultados, lo que incurre en una ordenación adicional no indexada.