2011-03-11 17 views
8

Puedo obtener el mismo resultado para estas consultas, pero ¿cuál es el más rápido y el más eficiente?unión interna y dónde en() cláusula de rendimiento?

donde in() o unión interna?

SELECT `stats`.`userid`,`stats`.`sumpoint` 
FROM `stats` 
INNER JOIN users 
ON `stats`.`userid` = `users`.`userid` 
WHERE `users`.`nick` = '$nick' 

ORDER BY `statoylar`.`sumpoint` DESC limit 0,10 

y

SELECT `stats`.`userid`,`stats`.`sumpoint` 
FROM `stats` 
WHERE userid 
IN (
SELECT userid 
FROM `users` 
WHERE `users`.`nick` = '$nick' 
) 
ORDER BY `stats`.`sumpoint` DESC limit 0,10 
+0

en definitiva unión interna evitar en la cláusula posible –

+0

MySQL tiene problemas con 'in' y consultas sub. Ver http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower-than-in-sql –

Respuesta

12

depende de su motor SQL. Los sistemas SQL más nuevos que tienen optimizadores de consultas razonables probablemente reescribirán ambas consultas en el mismo plan. Normalmente, una subconsulta (su segunda consulta) se reescribe utilizando una combinación (la primera consulta).

En motores SQL simples que pueden no tener grandes optimizadores de consultas, la unión debería ser más rápida porque pueden ejecutar subconsultas en una tabla temporal en memoria antes de ejecutar la consulta externa.

En algunos motores SQL que tienen una huella de memoria limitada, sin embargo, la subconsulta puede ser más rápida porque no requiere unir, lo que produce más datos.

Por lo tanto, en resumen, depende.

3


para comprobar el rendimiento de consultas de ejecutar tanto con EXPLAIN SELECT .... yo sepa, INNER JOIN es más rápido que IN
por cierto ¿cuál es su tipo de motor o de mesa MYISAMINNODB

+0

motor de tabla "MYISAM" – ocanal

+0

también un factor de dependencia es 'index' – diEcho

+1

+1 por sugerir 'explicar seleccionar', de lo cual estoy sorprendido de que esta sea la única respuesta para sugerir eso. – Seaux

-2

También hay otra opción, existe. Soy un tipo tsql tan ....

SELECT s.[userid], s.[sumpoint] 
FROM stats AS s 
WHERE 
    EXISTS (
    SELECT 1 
    FROM users AS u 
    WHERE 
     u.[userID] = s.[userID] 
     AND u.[nick] = '$nick' 
    ) 
ORDER BY s.[sumpoint] DESC 

Creo que EXISTS está disponible en la mayoría de los motores. En general es bastante rápido.

IN server sql al menos (2005+) no hay ninguna diferencia de rendimiento entre IN y EXISTS para los casos en que la columna en cuestión no es NULLABLE.

probablemente irrelevante pero bueno .....

Cuestiones relacionadas