MySQL, así como todos los demás sistemas, excepto SQL Server, puede optimizar LEFT JOIN/IS NULL regresar FALSEtan 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 HASHy MERGEunir algoritmos, lo único ANTI JOINque puede hacer esNESTED LOOPS ANTI JOIN
[...]
Esencialmente, [ NOT IN] es exactamente el mismo plan que LEFT JOIN/ IS NULLutiliza, 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 EXISTSrealice 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 EXISTSpredicado 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 NULLo en NOT INlugar de NOT EXISTS.
(énfasis agregado)