sql >> Base de Datos >  >> RDS >> Mysql

En mysql, ¿qué sql de unión interna es más efectivo y mejor?

Todos ellos son funcionalmente equivalentes. Incluso la separación entre la cláusula WHERE y la condición JOIN no cambiará los resultados cuando se trabaja completamente con uniones INNER (puede importar con uniones EXTERNAS). Además, todos deberían funcionar exactamente en el mismo plan de consulta (efectivamente, cero diferencia de rendimiento). El orden en que incluyas los artículos no importa . El motor de consultas es libre de optimizar según lo considere mejor dentro de la especificación funcional de la consulta. Incluso cuando identifique un comportamiento específico con respecto al orden, no debe contar con ello. La especificación permite que el parche de mañana cambie el comportamiento de hoy en esta área. Recuerde:el objetivo de SQL es estar basado en conjuntos y declarativo :le dices a la base de datos qué quieres que haga, no cómo quieres que lo haga.

Ahora que la corrección y el rendimiento están fuera del camino, estamos en cuestiones de estilo:cosas como la productividad del programador y la legibilidad/mantenibilidad del código. En ese sentido, la opción #4 en esa lista es de lejos la mejor opción, con el n.° 3 como la siguiente mejor, especialmente a medida que comienza a realizar consultas más complicadas. Simplemente no uses el A,B sintaxis nunca más; ha quedado obsoleto desde la versión de 1992 del estándar SQL. Escriba siempre el INNER JOIN completo (o LEFT JOIN /RIGHT JOIN /CROSS JOIN etc.).

Dicho todo esto, si bien el orden no importa (o, al menos, no debería importar) para el rendimiento, encuentro útil cuando escribo SQL usar una convención en mi enfoque que dicta el orden. Esto me ayuda a identificar errores o suposiciones falsas más adelante al depurar y solucionar problemas. Esta guía general que trato de seguir es comportarme como si el orden importara y luego, con eso en mente, tratar de mantener el conjunto de memoria de trabajo que necesita la base de datos para cumplir con la consulta lo más pequeño posible durante el mayor tiempo posible:comience primero con las tablas más pequeñas y luego únase a las más grandes; al considerar el tamaño de la tabla, tenga en cuenta las condiciones de la cláusula WHERE que coincidan con un índice; prefiera las uniones internas antes que las externas cuando tenga la opción; enumere las condiciones de unión para favorecer los índices (especialmente las claves primarias/agrupadas) primero, y otras condiciones en la unión en segundo lugar.