MySQL, así como todos los demás sistemas, excepto SQL Server, puede optimizar LEFT JOIN
/IS NULL
regresar FALSE
tan pronto como se encuentre el valor coincidente, y es el único sistema que se ocupó de documentar este comportamiento. […] Dado que MySQL no es capaz de usar HASH
y MERGE
unir algoritmos, lo único ANTI JOIN
que puede hacer esNESTED LOOPS ANTI JOIN
[...]
Esencialmente, [ NOT IN
] es exactamente el mismo plan que LEFT JOIN
/ IS NULL
utiliza, a pesar de que estos planes son ejecutados por las diferentes ramas del código y se ven diferentes en los resultados de EXPLAIN
. De hecho, los algoritmos son los mismos y las consultas se completan al mismo tiempo.
[...]
Es difícil decir la razón exacta de [caída del rendimiento cuando se usa NOT EXISTS
] , ya que esta caída es lineal y no parece depender de la distribución de datos, el número de valores en ambas tablas, etc., siempre que ambos campos estén indexados. Dado que hay tres partes de código en MySQL que esencialmente hacen un trabajo, es posible que el código responsable EXISTS
realice algún tipo de verificación adicional que requiera más tiempo.
[...]
MySQL puede optimizar los tres métodos para hacer una especie de NESTED LOOPS ANTI JOIN
. […] Sin embargo, estos tres métodos generan tres planes diferentes que se ejecutan mediante tres partes diferentes de código. El código que ejecuta el EXISTS
predicado es aproximadamente un 30% menos eficiente […]
Es por eso que la mejor manera de buscar valores perdidos en MySQL es usar a LEFT JOIN
/ IS NULL
o en NOT IN
lugar de NOT EXISTS
.
(énfasis agregado)