Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Welches innere Join-SQL ist in MySQL am effektivsten und am besten?

Alle diese sind funktional gleichwertig. Selbst die Trennung zwischen WHERE-Klausel und JOIN-Bedingung ändert nichts an den Ergebnissen, wenn vollständig mit INNER-Joins gearbeitet wird (bei OUTER-Joins kann dies eine Rolle spielen). Darüber hinaus sollten all dies in genau demselben Abfrageplan funktionieren (effektiv kein Leistungsunterschied). Die Reihenfolge, in der Sie Elemente hinzufügen, spielt keine Rolle . Die Abfragemaschine kann nach Belieben optimieren, da sie die funktionale Spezifikation der Abfrage für am besten geeignet hält. Auch wenn Sie ein bestimmtes Verhalten in Bezug auf die Reihenfolge feststellen, sollten Sie sich nicht darauf verlassen. Die Spezifikation erlaubt dem morgigen Patch, das heutige Verhalten in diesem Bereich zu ändern. Denken Sie daran:Der ganze Sinn von SQL besteht darin, mengenbasiert und deklarativ zu sein :Sie sagen der Datenbank was du willst, dass es funktioniert, nicht wie Sie möchten, dass es das tut.

Jetzt, wo Korrektheit und Leistung aus dem Weg geräumt sind, geht es um Stilfragen:Dinge wie Programmiererproduktivität und Lesbarkeit/Wartbarkeit des Codes. In dieser Hinsicht ist Option Nr. 4 in dieser Liste bei weitem die beste Wahl, mit Nr. 3 die zweitbeste, besonders wenn Sie anfangen, in kompliziertere Abfragen einzusteigen. Verwenden Sie einfach nicht A,B Syntax mehr; es ist seit der Version 1992 des SQL-Standards veraltet. Schreiben Sie immer den vollständigen INNER JOIN aus (oder LEFT JOIN /RIGHT JOIN /CROSS JOIN usw.).

Alles in allem, obwohl die Reihenfolge für die Leistung keine Rolle spielt (oder zumindest sollte), finde ich es hilfreich, wenn ich SQL schreibe, um eine Konvention in meinem Ansatz zu verwenden, die die Reihenfolge vorschreibt. Dies hilft mir, Fehler oder falsche Annahmen später beim Debuggen und Beheben von Fehlern zu identifizieren. Dieser allgemeine Leitfaden, dem ich zu folgen versuche, besteht darin, sich so zu verhalten, als ob die Reihenfolge eine Rolle spielt, und in diesem Sinne zu versuchen, den Arbeitsspeicher, der von der Datenbank benötigt wird, um die Abfrage so lange wie möglich so klein wie möglich zu halten:Beginnen Sie zuerst mit kleineren Tischen und schließen Sie sich dann den größeren an; Berücksichtigen Sie bei der Betrachtung der Tabellengröße Bedingungen in der WHERE-Klausel, die mit einem Index übereinstimmen. bevorzuge die inneren Joins vor den äußeren, wenn du die Wahl hast; Listen Sie Join-Bedingungen auf, um zuerst Indizes (insbesondere Primär-/Clusterschlüssel) und andere Bedingungen für den Join zu bevorzugen.