2011-01-22 15 views
6

En respuesta a this SQL question, me he encontrado con una declaración que fija el valor IN() operador es mucho más lento que INNER JOIN con el mismo contenido, hasta el punto de que es mejor crear una tabla temporal para los valores y UNIRSE a ellos. ¿Es cierto (en general, con MySQL, cualquier otro motor SQL) y, en caso afirmativo, por qué? Intuitivamente, IN debería ser más rápido: está comparando la posible coincidencia con un conjunto fijo de valores, que ya están en la memoria y en el formato necesario, mientras que con JOIN debería consultar los índices, posiblemente cargar datos desde el disco, y realice otras operaciones que pueden no ser necesarias con IN. ¿Me estoy perdiendo algo importante?SQL-valor fijado en() vs. INNER JOIN rendimiento

Tenga en cuenta que a diferencia de this question y sus muchos duplicados, estoy hablando de IN() que tiene un conjunto de valores fijo, no subconsulta.

+0

Esto es definitivamente algo que varía entre plataformas DB. En mi experiencia con SQL Server y PostgreSQL, las cláusulas 'IN' en constantes contra índices son muy rápidas. – Pointy

+0

La pregunta a la que se vinculó es SQL Server. No estoy seguro si ya está enterado, pero MySQL puede ser bastante catastróficamente malo con [con una consulta secundaria también] (http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower -than-in-sql/3417190 # 3417190) –

+0

@Martin pregunta original (primer enlace) fue sobre MySQL. Conozco los problemas de MySQL con las subconsultas, pero supuse que está bien con las listas constantes, por eso la afirmación en la respuesta de @ DVK me sorprendió. – StasM

Respuesta

7

Esto se relaciona con la longitud de la cláusula IN - y lo que a veces se denomina BUG en MySQL.

Parece que MySQL tiene un umbral bajo para las cláusulas IN, cuando cambia a una TABLA/ESCÁNER ÍNDICE en lugar de recopilar varias particiones (una por elemento IN) y fusionarlas.

Con Una unión interior, es casi siempre obligados a utilizar una fila fila por directa en JOIN colección, por lo que a veces es más rápido

se refieren a estas páginas del manual de MySQL

podría estar equivocado, ya que parece dar a entender que debería IN (constant value list) ALWA ys utiliza una búsqueda binaria en cada elemento ...

+1

Pon los valores en una tabla temporal. – Pointy

+0

¿Alguna idea sobre qué longitud hace que vaya mal? – StasM

+0

@StasM lo siento pero no estoy seguro. El comportamiento también puede ser diferente con las versiones de MySQL. – RichardTheKiwi