Left JOIN schneller oder Inner Join schneller?
So... welcher ist schneller (NULl-Wert ist nicht ein Problem), und indiziert sind.
SELECT * FROM A
JOIN B b ON b.id = a.id
JOIN C c ON c.id = b.id
WHERE A.id = '12345'
Mit Den Linken Verbindet:
SELECT * FROM A
LEFT JOIN B ON B.id=A.bid
LEFT JOIN C ON C.id=B.cid
WHERE A.id = '12345'
Hier ist die eigentliche Abfrage
Hier ist es.. beide das gleiche Ergebnis zurückgeben
Query (0.2693sec) :
EXPLAIN EXTENDED SELECT *
FROM friend_events, zcms_users, user_events,
EVENTS WHERE friend_events.userid = '13006'
AND friend_events.state =0
AND UNIX_TIMESTAMP( friend_events.t ) >=1258923485
AND friend_events.xid = user_events.id
AND user_events.eid = events.eid
AND events.active =1
AND zcms_users.id = user_events.userid
EXPLAIN
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE zcms_users ALL PRIMARY NULL NULL NULL 43082
1 SIMPLE user_events ref PRIMARY,eid,userid userid 4 zcms_users.id 1
1 SIMPLE events eq_ref PRIMARY,active PRIMARY4 user_events.eid 1 Using where
1 SIMPLE friend_events eq_ref PRIMARY PRIMARY 8 user_events.id,const 1 Using where
LEFTJOIN QUERY: (0.0393 sec)
EXPLAIN EXTENDED SELECT *
FROM `friend_events`
LEFT JOIN `user_events` ON user_events.id = friend_events.xid
LEFT JOIN `events` ON user_events.eid = events.eid
LEFT JOIN `zcms_users` ON user_events.userid = zcms_users.id
WHERE (
events.active =1
)
AND (
friend_events.userid = '13006'
)
AND (
friend_events.state =0
)
AND (
UNIX_TIMESTAMP( friend_events.t ) >=1258923485
)
EXPLAIN
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE friend_events ALL PRIMARY NULL NULL NULL 53113 Using where
1 SIMPLE user_events eq_ref PRIMARY,eid PRIMARY 4 friend_events.xid 1 Using where
1 SIMPLE zcms_users eq_ref PRIMARY PRIMARY 4 user_events.userid 1
1 SIMPLE events eq_ref PRIMARY,active PRIMARY 4 user_events.eid 1 Using where
Warum nicht Sie laufen beide und sagen Sie uns, welche ist schneller?
Diese Frage sollte anders formuliert, "Wie kann ich herausfinden, welche Abfrage läuft schneller?"
Diese Veranstaltung zurück, die gleichen Ergebnisse? (Spalten, nicht Zeilen)
Ich sehe nicht ein, warum Sie zurückkehren würde, verschiedene Spalten. Im Gegenteil, es gibt eine starke Möglichkeit, dass Sie zurückkehren wird, unterschiedliche Zeilen.
Der LEFT JOIN Beispiel würde die Rückgabe von Zeilen aus, wo es nicht von Zeilen in B und/oder C der B/C-Säulen würde null sein. So hätten Sie mehr Spalten in einer LEFT JOIN-resultset.
Diese Frage sollte anders formuliert, "Wie kann ich herausfinden, welche Abfrage läuft schneller?"
Diese Veranstaltung zurück, die gleichen Ergebnisse? (Spalten, nicht Zeilen)
Ich sehe nicht ein, warum Sie zurückkehren würde, verschiedene Spalten. Im Gegenteil, es gibt eine starke Möglichkeit, dass Sie zurückkehren wird, unterschiedliche Zeilen.
Der LEFT JOIN Beispiel würde die Rückgabe von Zeilen aus, wo es nicht von Zeilen in B und/oder C der B/C-Säulen würde null sein. So hätten Sie mehr Spalten in einer LEFT JOIN-resultset.
InformationsquelleAutor Murvinlai | 2009-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es kommt drauf an, laufen Sie beide zu finden, führen Sie dann eine 'erklären, wählen Sie" nach einer Erklärung.
Die tatsächliche performance-Unterschied reicht von "praktisch nicht existent" bis "ziemlich groß", je nachdem, wie viele Zeilen in Einer mit der id='12345' keine übereinstimmenden Datensätze in B und C.
Update (basierend auf gepostet von query-Plänen)
Wenn Sie INNER JOIN ist es egal (die Ergebnisse angeht, nicht die Leistung-klug), die Tabelle mit zu beginnen, also optimizer versucht zu Holen die man denkt es wäre am besten erfüllen. Es scheint, Sie haben die Indizes auf alle entsprechenden PK /FK-Spalten und Sie entweder nicht über einen index auf
friend_events.userid
oder es gibt zu viele Einträge mituserid = '13006'
und es nicht verwendet wird; entweder Weg Optimierer wählt die Tabelle mit weniger Zeilen als "Basis" - in diesem Fall ist eszcms_users
.Wenn Sie LEFT JOIN es hat Materie (Ergebnisse-Weise), die Tabelle mit zu beginnen; so
friend_events
abgeholt wird. Jetzt warum dauert es weniger Zeit, so ich bin mir nicht ganz sicher; ich vermutefriend_events.userid
Zustand hilft. Wenn Sie waren, um einen index hinzuzufügen, (ist es wirklich varchar, btw? nicht numerisch?) auf dass, Ihr INNER JOIN könnte sich anders Verhalten (und schneller) als gut.Kannst du die Ergebnisse von "explain select" für beide Abfragen?
InformationsquelleAutor ChssPly76
Den INNER JOIN zu tun hat, eine zusätzliche überprüfung, um entfernen Sie alle Datensätze von A, die keine übereinstimmenden Datensätze in B und C. Je nach Anzahl der Datensätze zunächst nach der Rückkehr von Einem KÖNNTE es haben einen Einfluss.
InformationsquelleAutor DJ.
Verwenden ERKLÄREN zu sehen, die Abfrage-plan. Wahrscheinlich ist es der gleiche plan für die beiden Fälle, so bezweifle ich, es macht viel Unterschied, vorausgesetzt, es gibt keine Zeilen, die nicht übereinstimmen. Aber das sind zwei verschiedene Abfragen, so dass es wirklich keinen Sinn, Sie zu vergleichen - Sie sollten benutzen Sie einfach die richtige.
Warum nicht die "INNER JOIN" - Schlüsselwort anstelle von "LEFT JOIN"?
InformationsquelleAutor Mark Byers
LEFT JOIN
zeigt alle Daten ausA
und zeigt nur Daten ausB/C
nur, wenn die Bedingung wahr ist. FürINNER JOIN
es hat zu tun, einige zusätzliche überprüfung auf beidentables
. So, ich denke, das erklärt, warumLEFT JOIN
ist schneller.InformationsquelleAutor symfonian