tablas recomendaciones porque optimizar lenta las dañan cuello consultas consulta consejos botella sql join where

recomendaciones - porque se dañan las tablas en mysql



SQL JOIN ¿dónde ubicar la condición WHERE? (3)

Tengo dos ejemplos siguientes.

1. Ejemplo (DONDE)

SELECT 1 FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id WHERE t2.field = true

2. Ejemplo (UNIRSE A)

SELECT 1 FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id AND t2.field = true

¿Cuál es la forma más rápida en términos de rendimiento? ¿Qué prefieres?


Creo que la forma más rápida es poner el filtro en la cláusula where, porque procederá ese filtro primero en donde, y luego en la cláusula join, por lo que no habrá necesidad de permutación de filtros.


Si un filtro ingresa en una condición JOIN funcionalmente (es decir, es una condición de unión real, no solo un filtro), debe aparecer en la cláusula ON de esa unión.

Digno de notar:

  • Si lo coloca en la cláusula WHERE , las interpretaciones son las mismas si la unión es INNER , de lo contrario, difiere. Como se mencionó en los comentarios, realmente no importa ya que de todos modos el resultado es diferente.

  • Colocar el filtro en la cláusula WHERE cuando realmente es una condición OUTER JOIN cancela implícitamente la naturaleza OUTER de la condición ("unir incluso cuando no hay registros") ya que estos filtros implican que debe haber registros existentes en primer lugar. Ejemplo:

... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5 es correcto

... table1 t LEFT JOIN table2 u ON ... WHERE t2.column = 5

es incorrecto, ya que t2.column = 5 le dice al motor que se esperan registros de t2, lo que va en contra de la combinación externa. Excepción a esto sería un filtro IS NULL , como WHERE t2.column IS (NOT) NULL (que de hecho es una forma conveniente de construir combinaciones externas condicionales)

  • LEFT uniones LEFT y RIGHT son implícitamente uniones OUTER .

Espero que haya ayudado.


JOIN condiciones de JOIN normalmente deberían ser independientes de las condiciones del filtro. Usted define las reglas de su unión (el cómo ) con ON . Usted filtra lo que quiere con WHERE . En cuanto a rendimiento, no hay una regla general en todos los motores y diseños, por lo que su kilometraje variará mucho.