211 votes

JOIN requêtes vs plusieurs requêtes

Les requêtes JOIN sont-elles plus rapides que plusieurs requêtes? (Vous exécutez votre requête principale, puis de nombreux autres SELECT en fonction des résultats de votre requête principale)

Je demande parce que les joindre compliquerait BEAUCOUP la conception de mon application

Si elles sont plus rapides, est-ce que quelqu'un peut approximer très approximativement de combien? Si c'est 1,5 fois je m'en fiche, mais si c'est 10 fois je suppose que oui.

114voto

Frank Forte Points 169

Pour les jointures internes, une seule requête a du sens, puisque vous obtenez seulement les lignes correspondantes. De gauche rejoint, plusieurs requêtes est beaucoup mieux... regarde la suite de test que j'ai fait:

  1. Seule requête avec 5 Rejoint

    requête: 8.074508 secondes

    résultat: 2268000

  2. 5 requêtes dans une rangée

    combiné moment de la requête: 0.00262 secondes

    taille de résultat: 165 (6 + 50 + 7 + 12 + 90)

.

Notez que nous obtenons les mêmes résultats dans les deux cas (6 x 50 x 7 x 12 x 90 = 2268000)

gauche rejoint utiliser de façon exponentielle plus de mémoire avec des données redondantes.

La limite de la mémoire peut ne pas être aussi mauvais si vous avez seulement faire une jointure de deux tables, mais généralement de trois ou plus et il prend de la valeur de requêtes différentes.

Comme une note de côté, mon serveur MySQL est juste à côté de mon serveur d'application... donc le temps de connexion est négligeable. Si votre temps de connexion est dans les secondes, alors peut-être il ya un avantage

Frank

94voto

Paolo Bergantino Points 199336

C'est trop vague pour vous donner une réponse pertinente à votre cas. Cela dépend de beaucoup de choses. Jeff Atwood (fondateur de ce site) a écrit à ce sujet . Pour l'essentiel, cependant, si vous avez les bons index et que vous faites correctement vos JOIN, il sera généralement plus rapide de faire un voyage que plusieurs.

23voto

Valentin Flachsel Points 5994

Je suis réellement à cette question, la recherche d'une réponse moi-même, et après avoir lu les réponses données, je peux qu'être d'accord que la meilleure façon de comparer les requêtes DB de rendement est d'obtenir des chiffres réels parce qu'il y a de nombreuses variables à prendre en compte, MAIS, je pense aussi que de comparer les chiffres entre eux mène à rien de bon dans presque tous les cas. Ce que je veux dire c'est que ce nombre doit toujours être comparé avec un nombre acceptable et certainement pas de rapport les uns avec les autres.

Je peux comprendre qu'une façon d'interroger faut dire 0.02 secondes, et l'autre de 20 secondes, c'est une énorme différence. Mais que faire si un moyen de l'interrogation prend 0.0000000002 secondes, et l'autre 0.0000002 secondes ? Dans les deux cas une façon est d'une grande quantité de 1000 fois plus rapide que l'autre, mais est-il vraiment encore "énorme" dans le second cas ?

Bas de ligne que personnellement je vois les choses: si il fonctionne bien, optez pour la solution de facilité.

16voto

levans Points 51

Faites un test rapide en sélectionnant une ligne dans une table de 50 000 lignes et en joignant une ligne dans une table de 100 000 lignes. Fondamentalement ressemblé à:

 $id = mt_rand(1, 50000);
$row = $db->fetchOne("SELECT * FROM table1 WHERE id = " . $id);
$row = $db->fetchOne("SELECT * FROM table2 WHERE other_id = " . $row['other_id']);
 

contre

 $id = mt_rand(1, 50000);
$db->fetchOne("SELECT table1.*, table2.*
    FROM table1
    LEFT JOIN table1.other_id = table2.other_id
    WHERE table1.id = " . $id);
 

La méthode de sélection deux prenait 3,7 secondes pour 50 000 lectures, tandis que la commande JOIN prenait 2,0 secondes sur mon ordinateur lent à la maison. INNER JOIN et LEFT JOIN n'ont pas fait de différence. Extraire plusieurs lignes (par exemple, en utilisant IN SET) a donné des résultats similaires.

6voto

A Boy Named Su Points 36

Dans mon expérience, j'ai trouvé que c'est généralement plus rapide pour exécuter plusieurs requêtes, en particulier lors de la récupération de grands ensembles de données.

Lors de l'interaction avec la base de données à partir d'une autre application, telle que le PHP, il y a l'argument d'un voyage au serveur plus nombreux.

Il existe d'autres moyens de limiter le nombre de déplacements effectués vers le serveur et encore exécuter plusieurs requêtes qui sont souvent non seulement plus rapide, mais aussi rendre l'application plus facile à lire - par exemple mysqli_multi_query.

Je ne suis pas un novice quand il s'agit de SQL, je pense qu'il ya une tendance pour les développeurs, en particulier les juniors de passer beaucoup de temps à essayer d'écrire très intelligent rejoint parce qu'ils sont intelligents, tandis que il ya effectivement des façons intelligentes pour extraire des données qui vous paraître simple.

Le dernier paragraphe est une opinion personnelle, mais j'espère que cette aide. Je suis d'accord avec les autres mais qui a dit qu'on devrait l'indice de référence. Aucune approche est une balle d'argent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X