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.

InformationsquelleAutor Murvinlai | 2009-11-27

Schreibe einen Kommentar