O el artículo que leíste usaba un mal ejemplo, o malinterpretaste su punto.
select username from users where company = 'bbc' or company = 'itv';
Esto es equivalente a:
select username from users where company IN ('bbc', 'itv');
MySQL puede usar un índice en company
para esta consulta muy bien. No hay necesidad de hacer ninguna UNIÓN.
El caso más complicado es cuando tienes un OR
condición que involucra dos diferentes columnas.
select username from users where company = 'bbc' or city = 'London';
Supongamos que hay un índice en company
y un índice separado en city
. Dado que MySQL generalmente usa solo un índice por tabla en una consulta determinada, ¿qué índice debería usar? Si usa el índice en company
, todavía tendría que hacer un escaneo de tabla para encontrar filas donde city
es Londres. Si usa el índice en city
, tendría que hacer un escaneo de tabla para las filas donde company
es bbc.
La UNION
la solución es para este tipo de casos.
select username from users where company = 'bbc'
union
select username from users where city = 'London';
Ahora cada subconsulta puede usar el índice para su búsqueda, y los resultados de la subconsulta se combinan mediante UNION
.
Un usuario anónimo propuso una edición de mi respuesta anterior, pero un moderador rechazó la edición. Debería haber sido un comentario, no una edición. La afirmación de la edición propuesta era que UNION tiene que ordenar el conjunto de resultados para eliminar las filas duplicadas. Esto hace que la consulta se ejecute más lentamente y, por lo tanto, la optimización del índice es un lavado.
Mi respuesta es que los índices ayudan a reducir el conjunto de resultados a una pequeña cantidad de filas antes de que ocurra la UNIÓN. UNION, de hecho, elimina los duplicados, pero para hacerlo solo tiene que ordenar el pequeño conjunto de resultados. Puede haber casos en los que las cláusulas WHERE coincidan con una parte significativa de la tabla, y ordenar durante UNION sea tan costoso como simplemente hacer el escaneo de la tabla. Pero es más común que las búsquedas indexadas reduzcan el conjunto de resultados, por lo que la clasificación es mucho menos costosa que el escaneo de tablas.
La diferencia depende de los datos de la tabla y de los términos que se buscan. La única forma de determinar la mejor solución para una consulta dada es probar ambos métodos en el perfilador de consultas de MySQL y comparar su rendimiento.