2015-04-30 1 views
-2

J'ai deux tables avec le même nom de colonne. Je veux rechercher dans eux.J'ai fait des recherches et réalisé que l'utilisation UNION ALL est meilleure que INNER JOIN (en termes de vitesse et de performance). Maintenant, je veux savoir si le résultat n'est pas trouvé, UNION ALL est mieux encore?jointure interne VS union tous, lorsque le résultat n'est pas trouvé

Je pense que l'algorithme de JOIN Keyword est: si le résultat n'est pas trouvé dans la première table, l'opération s'arrête (dans la deuxième table, la recherche ne sera pas). Mais UNION ALL rechercher toutes les tables en tout cas. Je pense que c'est juste? Si ma pensée est bonne alors INNER JOIN est mieux quand le résultat n'est pas trouvé?

point: col est indexé (phpmyadmin).

Maintenant, laquelle des meilleures performances si le résultat n'est pas trouvé?

SELECT col FROM table1 WHERE col='test' 
UNION ALL 
SELECT col FROM table2 WHERE col='test'; 

VS

SELECT col 
FROM table1 
INNER JOIN table2 
ON table1.col=table2.col 
WHERE col='test'; 
+0

S'il vous plaît modifier votre question et ajouter des exemples de données et les résultats souhaités. Que voulez-vous que la requête renvoie lorsque le résultat n'est pas trouvé? –

+0

Votre exemple INNER JOIN ne donnera pas les mêmes résultats, il donnera une INTERSECTION plutôt qu'une UNION. – MatBailie

Répondre

2

UNION ALL est généralement plus rapide. Il ne nécessite aucune recherche complexe. Il concatène juste deux résultats de requête. Si les données sont interrogées à partir des deux tables dans le cas de INNER JOIN dépend grandement de la base de données, sans parler des détails spécifiques (index utilisés, etc).

Cela dit, vos requêtes ne sont pas du tout les mêmes. La version avec UNION ALL retournera deux lignes si les deux tables contiennent un tel enregistrement et retournera toujours une ligne si une table contient une correspondance.

La version avec INNER JOIN sera seulement renvoyer une ligne si les deux tables contiennent un enregistrement correspondant, et ne reviendra pas de suite si un seul d'entre eux (ou pas) contient un enregistrement correspondant. NB, celui avec INNER JOIN utilise la colonne sans critère col, ce qui entraînera probablement une erreur. En règle générale, ne commencez pas l'optimisation basée sur la théorie. Ecrire des requêtes claires et lisibles qui s'appliquent le mieux possible à la situation (sémantiquement correct). Optimisez seulement quand vous en avez besoin.

Veillez également à ne pas optimiser la mauvaise chose. Même si la version INNER JOIN serait légèrement plus rapide si aucune donnée n'est trouvée, la version UNION ALL sera quand même rapide comme l'éclair, donc il est préférable de choisir la version la plus optimale pour les situations où vous avez une correspondance.

+0

Je viens d'ajouter (puisque @GolezTrol a déjà répondu) qu'avec 'UNION ALL' la seule façon de 'ORDER' est ** à la fin ** (après union) contrairement à' INNER JOIN' (où vous pouvez déjà commander vos lignes ** avant d'être joint **) La meilleure réponse sera donnée par 'plan d'exécution'. – MacKentoch