2017-02-13 2 views
0

Es gibt Geschäftsanforderungen im Projekt, die sich auf einige Tabellen beziehen. Die folgenden zwei Abfrageoptionen sind in diesen Fällen für die Leistungsoptimierung von Vorteil. Wie soll ich wählen? Erstens: Filtern Sie die Kartesisches Produkt:Unterschiedliche SQL-Abfrageeffizienz

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 

Zweitens: Linke Außenverbindungsmodus oder rechten äußeren Verbindungsmodus

select table1.a ,table2.b from table1 left join table2 on table1.id=table2.id 

Sagen Sie mir bitte. Vielen Dank.

+0

ich die Frage nicht verstehen. Kannst du bitte etwas ausarbeiten? – 0xCAFEBABE

+0

Die beiden sind nicht gleichwertig. 'LEFT JOIN' gibt' table1' Zeilen zurück, die keine übereinstimmende 'table2' Zeile haben, kartesische Produkte geben diese Zeilen nicht zurück. – Barmar

+0

@ 0xCAFEBABE Verwenden Sie die obigen zwei Möglichkeiten, um die gleichen Daten abzufragen, aber ich würde gerne wissen, in welchem ​​Fall die Verwendung dieser Art die Leistung wird besser – lpgad

Antwort

0

Wenn Sie sie in einer Form schreiben, in der sie die gleichen Ergebnisse liefern, erwarten Sie, dass der Abfrageanalysator Ihnen identische * Abfragepläne gibt. Das heißt JOIN nicht ,, weil , viel weniger klar ist, und ist seit Jahrzehnten

veraltet Wenn Sie die Leistung von zwei verschiedenen Abfragen vergleichen wollen, ist die einfachste Methode, sowohl zu laufen und vergleichen, wie lange sie nahm an, obwohl sie überprüfen, dass sie verschiedene Dinge tun, indem sie die Abfragepläne vergleichen (EXPLAIN query text here in mysql gibt Ihnen den Plan für eine Frage)

Merken Sie, dass das Sagen "ich weiß, dass sie unterschiedliche Resultate geben, aber ich will das schnellere" ist nie eine vernünftige Sache in der Programmierung zu sagen. Sie sollten immer genau wissen, welche Ergebnisse Sie wollen.

I.e.

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 

hat die gleiche Bedeutung wie

select table1.a ,table2.b from table1 join table2 on table1.id=table2.id 

und

select table1.a ,table2.b from table1 left join table2 on table1.id=table2.id 

hat die gleiche Bedeutung wie

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select table1.a , null from table1 where table1.id not in (select table2.id from table2) 

und die Formen verbinden, die Sie nicht verwenden:

select table1.a ,table2.b from table1 right join table2 on table1.id=table2.id 

hat die gleiche Bedeutung wie

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select null, table2.b from table2 where table2.id not in (select table1.id from table1) 

Und

select table1.a ,table2.b from table1 full join table2 on table1.id=table2.id 

hat die gleiche Bedeutung wie

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select table1.a , null from table1 where table1.id not in (select table2.id from table2) 
union 
select null, table2.b from table2 where table2.id not in (select table1.id from table1) 
-2

Zweite Abfrage ist schneller. Es hat keine verschachtelte Bedingung. SQL-Engine behandelt Join als einzelne Tabelle oder Ansicht.

In meiner Openion erste Abfrage funktioniert als eine "For-Schleife", so Laufzeitkomplexität ist O (n), und seconf Abfrage arbeitet als Switch Case in Worsecase Laufzeitkomplexität ist O (log n).

+0

In jedem Fall ist die zweite besser als die erste? – lpgad

+0

SQL durchläuft einen Abfrageplanschritt. Die beiden Abfragen von OP haben ähnliche Pläne (identisch, wenn er zu "Join" von "Left Join" wechselt) – Caleth

Verwandte Themen