Después de leer la consulta SQL lenta, no estoy seguro de cómo optimizar , me hizo pensar en el rendimiento general de las consultas. Seguramente, necesitamos que los resultados de la primera tabla (cuando se unen otras tablas) sean lo más pequeños posible antes de unirse (uniones internas para esta pregunta) para que nuestras consultas sean un poco más rápidas.
Ejemplo, si esto:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
Sé mejor / más rápido que:
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
Mi teoría es la siguiente (esta podría no ser la implementación correcta, estoy tratando de recordar de un libro interno de SQL Server 2008 que leí (MSFT Press)):
- El procesador de consultas primero obtiene la tabla izquierda (tabla1)
- Se une a la segunda tabla (tabla2) y forma un producto cartesiano antes de filtrar las filas necesarias (si corresponde)
- Luego realiza las cláusulas WHERE, ORDER BY, GROUP BY, HAVING con la instrucción SEELCT en último lugar.
Entonces, si en la declaración n. ° 1 anterior, la tabla es más pequeña, el motor SQL tiene menos trabajo que hacer al formar los productos cartesianos. Luego, cuando alcanza la instrucción where, tiene un conjunto de resultados reducido desde el cual filtrar en la memoria.
Podría estar tan lejos de la marca que es irreal. Como dije, es una teoría.
¿Tus pensamientos?
Nota : Acabo de pensar en esta pregunta y aún no he tenido la oportunidad de realizar ninguna prueba.
Nota 2 : Etiquetado como SQL Server ya que no sé nada sobre la implementación de MySql, etc. No dude en responder / comentar de todos modos