2011-10-25 4 views
3

pourriez-vous me dire laquelle de ces deux phrases est la plus rapide?mysql - "INNER JOIN" ou "IN". Lequel est plus vite?

1ère phrase:

SELECT DISTINCT(t1.user_id) FROM table_users as t1 WHERE t1.user_town IN (SELECT t2.town FROM table_towns as t2) 

2ème phrase:

SELECT DISTINCT(t1.user_id) FROM table_users as t1 
    INNER JOIN (SELECT t2.town FROM table_towns as t2) as t3 ON t1.user_town = t3.town 

Selects j'utilise sont généralement un peu plus complexe. Et si possible j'essaie d'utiliser IN (...) parce que je peux passer une valeur ou une sélection de table.

+0

J'ai changé le résultat de SELECT t1. * En SELECT DISTINCT (t1.user_id) pour éviter des résultats différents. Comme c'est généralement ce qui m'importe vraiment – Seeker

Répondre

1

Ils ressemblent tous les deux assez à mes yeux. Je suis assez sûr qu'un seul SELECT fournira de meilleures performances, étant donné que MySQL is not particularly good with subqueries:

SELECT t1.* 
FROM table_users t1 
INNER JOIN table_towns t2 ON t1.user_town = t2.town 

Dans tous les cas, vous devriez voir ce que le EXPLAIN plan pour la requête doit dire et effectuer une analyse comparative des données en direct.

0

Vous devez le mesurer et émettre un plan d'explication pour être sûr. Mais je n'utiliserais aucun de ceux-ci:

select u.* from table_users as u 
inner join table_towns as t on u.user_town = t.town 
0

IN est en train de tuer pour MySQL. Utilisez plutôt EXISTS.

INNER JOIN peut être assez rapide, mais les résultats ne sont pas nécessairement les mêmes. Vous devrez peut-être grouper ou distinct pour obtenir les mêmes résultats (ou des résultats similaires), bien que dans ce cas, je pense que vous êtes en sécurité.

Si vous utilisez une jointure interne, n'en faites pas une sous-sélection, car MySQL ne les gère pas non plus. Joignez-vous simplement à la table table_towns elle-même.

+0

Ce n'est plus le cas pour les dernières versions de MySQL. 'IN (select ....)' a été optimisé. – Johan

+0

Peut-être ne tue plus, mais reste beaucoup plus lent en comparaison. – GolezTrol

+0

@Johan - De quelle version est-ce efficace? Serait intéressant d'entendre (** de tests réels non seulement ce que vous croyez être vrai! **) si la grande disparité entre '=' et 'IN' que [est apparent ici] (http://stackoverflow.com/ questions/3416076/this-select-query-takes-180-secondes-to-finish/3417098 # 3417098) est corrigé.La réponse de Mark Byer que je lierai dans les commentaires là-bas indique que ce n'est pas prévu pour être corrigé jusqu'à la version 6.0 –

0

Il n'y a pas de réponse définitive à votre question. Cela dépend vraiment de ce que sont les index sur les tables et si le SGBD que vous utilisez peut les utiliser ou non. J'ai eu des cas où un IN réduit le temps d'exécution par rapport à INNER JOIN et les instances où INNER JOIN est plus rapide.

exemple Anecdotal (en utilisant SQL Server, si):

Je joignait une table temporaire à une table régulière en utilisant un champ commun. Le plan d'exécution montrait un HACH JOIN entre les deux tables lorsque j'ai regardé le plan d'exécution. Le temps d'exécution était de 2 secondes aprox. J'ai changé le INNER JOIN en IN avec un subselect, le HASH JOIN a disparu et le temps d'exécution a été coupé à 1 sec aprox. Il utilisait maintenant l'index sur la table principale.

0

Les 2 requêtes que vous avez postées peuvent produire des résultats différents (la seconde avec JOIN peut retourner plus de lignes que la première), donc je pense qu'il n'est pas correct de comparer les performances.

+0

vous avez raison. Je viens de mettre distinct de seulement 1 champ pour éviter des résultats différents. – Seeker

+0

Dans ce cas, je crois que la seconde (avec JOIN) peut être un peu pire (si l'optimiseur n'est pas assez intelligent pour se déplacer, 'DISTINCT' à la sous-requête – a1ex07