2010-12-20 2 views
0

Diese beiden mysql-Abfragen geben die gleiche Ergebnismenge zurück. Entweder gibt mir die Ergebnisse, die ich will. Aber ist der eine dem anderen vorzuziehen?Zwei MySQL-Abfragen, gleiche Ergebnisse: Ist eins besser als das andere?

SELECT links.*, users.user_name 
FROM links 
LEFT JOIN terms 
ON links.link_id = terms.terms_link_id 
LEFT JOIN users 
ON links.link_user = users.user_id 
WHERE terms.terms_tag_id = ? 

-

SELECT links.*, users.user_name 
FROM links, users, terms 
WHERE links.link_id = terms.terms_link_id 
AND links.link_user = users.user_id 
AND terms.terms_tag_id = ? 
+0

klar zu sein - es gibt nur PHP-Strings. Wenn Sie speziell nach ** Anfragen ** fragen wollen - vermeiden Sie alles außer sql. – zerkms

+2

BTW, da Sie 'LEFT JOIN' verwenden - diese 2 Abfragen können ** unterschiedliche Ergebnisse ** zurückgeben. – zerkms

Antwort

1

Beide sind schlecht

SELECT links.*, users.user_name 
FROM links 
INNER JOIN terms 
    ON links.link_id = terms.terms_link_id AND terms.terms_tag_id = $tag_id 
INNER JOIN users 
    ON links.link_user = users.user_id; 

nur eine Regel

  • tun einen Ausführungsplan, DESC EXTENDED YOUR_QUERY; zu überprüfen, wie die Optimierung auf mysql
  • getan werden kann
+0

Nur soviel lesen: " VORSICHT Sie sollten niemals Beschränkungen für die Reihen platzieren, um in einer Verknüpfung der oN-Klausel zurückgegeben werden;. nur Bedingungen der Form verbinden t1.col1 = t2.col2 (wobei T1 und t2 sind Tabellen-aliases) hier platziert werden sollten Beschränkungen in Bezug bestimmt filtern Das Resultset sollte in eine WHERE-Klausel eingefügt werden. " von "Beginning MySQL Database Design und Optimierung: Von Anfänger bis Professional" von Jon Stephens und Chad Russell, im Jahr 2004 von Apress veröffentlicht. Das würde bedeuten, dass die Bedingung nach UND in einer WHERE-Klausel enthalten sein sollte, da sie die Ergebnismenge filtert. Warum sollte das vorgeschlagen werden? –

+0

@mos fetisch - nun, ein 'show profile' auf beiden Abfragen, die besser funktionieren? – ajreal

3

wie folgt aussieht beantwortet Ihre Frage: Inner join vs Where

+0

Das stimmt, aber eine dritte Option, eine Variation der ersten Abfrage, die bewegt, wo Klausel Element nach links auf Klausel für Bedingungen beitreten würde möglicherweise die Anzahl der Datensätze beseitigen etwas schneller zu untersuchen und sein ... – Tahbaza

Verwandte Themen