Las subconsultas suelen estar bien a menos que sean subconsultas dependientes (también conocido como correlated subqueries). Si solo está utilizando subconsultas independientes y están utilizando índices apropiados, entonces deberían ejecutarse rápidamente. Si tiene una subconsulta dependiente, puede encontrarse con problemas de rendimiento porque una subconsulta dependiente normalmente se debe ejecutar una vez para cada fila en la consulta externa. Entonces, si su consulta externa tiene 1000 filas, la subconsulta se ejecutará 1000 veces. Por otro lado, una subconsulta independiente normalmente solo debe evaluarse una vez.
Si no está seguro de lo que significa que una subconsulta sea dependiente o independiente aquí hay una regla general: si puede tomar la subconsulta, eliminarla de su contexto, ejecutarla y obtener un conjunto de resultados, entonces es una independent subquery
.
Si obtiene un error de sintaxis porque se refiere a algunas tablas fuera de la subconsulta, entonces es un dependent subquery
.
La regla general, por supuesto, tiene algunas excepciones. Por ejemplo:
- Muchos optimizadores pueden tomar una subconsulta dependiente y encontrar una forma de ejecutarla eficientemente como un JOIN. Por ejemplo, una consulta NOT EXISTS puede dar como resultado un plan de consulta ANTI JOIN, por lo que no necesariamente será más lento que escribir la consulta con un JOIN.
- MySQL tiene un bug donde una subconsulta independiente dentro de una expresión IN se identifica incorrectamente como una subconsulta dependiente y, por lo tanto, se utiliza un plan de consulta subóptimo. Esto aparentemente está arreglado en las versiones más nuevas de MySQL.
Si el rendimiento es un problema, mida sus consultas específicas y vea qué funciona mejor para usted.
No es que no haya una solución mágica: el problema es que la pregunta es demasiado amplia para que se pueda responder de manera razonable.No hay garantía de que lo que funciona en una base de datos (MySQL) funcione exactamente igual en otro. La regla más simple es que si la (s) columna (s) de la subconsulta están en el conjunto de resultados final, use un JOIN - es el medio más óptimo para obtener datos de dos tablas. De lo contrario, una subconsulta está bien, pero las correlacionadas pueden causar problemas (aunque no con EXISTS). –
¿En base a qué afirma que se están utilizando en exceso las consultas secundarias? Parece extraño decidir que _y luego_ pedir información sobre las mejores prácticas para usar subconsultas. –
Posible duplicado de [Unir frente a una subconsulta] (http://stackoverflow.com/questions/2577174/join-vs-sub-query) –