2013-02-21 91 views
0

我有兩個表 - >LEFT JOIN比內部快得多JOIN

  • 用戶

    user_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY 
    username VARCHAR(200) NOT NULL 
    
  • ping_id INT UNSIGNED NOT NULL AUTO_INCREMENT PPRIMARY KEY 
    disqus_id VARCHAR(32) NOT NULL 
    user_id INT UNSIGNED NOT NULL 
    
    INDEX combo1(disqus_id,user_id) 
    

我運行此查詢 - >

EXPLAIN SELECT pings.*, username 
      FROM pings 
    INNER JOIN users USING(user_id) 
     WHERE pings.disqus_id = 'post_168' AND user_id = '1' 
     ORDER BY pings.ping_id DESC LIMIT 2 

pimgs下的Extra列爲Using where; Using temporary; Using filesort,並且在用戶下方說Using where; Using join buffer

我運行此查詢 - >

EXPLAIN SELECT pings.*, username 
      FROM pings 
    LEFT JOIN users USING(user_id) 
     WHERE pings.disqus_id = 'post_168' AND user_id = '1' 
     ORDER BY pings.ping_id DESC LIMIT 2 

Extra下pimgs柱說Using where下用戶是空的。

發生了什麼事?

+0

每個人需要多長時間? – ruakh 2013-02-21 19:27:46

+0

您意識到「INNER JOIN」和「LEFT JOIN」是對結果集有不同影響的不同類型的查詢。 – CAbbott 2013-02-21 19:27:59

+0

你能詳細解釋@CAbbott – sanchitkhanna26 2013-02-21 19:32:36

回答

2

因此,如果您正在使用user_id必須在兩個表中,但左連接會在表中的返回值,而不是在B表

以下兩個子句具有相同的語義:

a LEFT JOIN b USING (c1,c2,c3) 
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3 
1

您正在創建2個不同的查詢,這些查詢有兩種不同的生產要求,可能會發生什麼,相同的結果集:

查詢1: (INNER JOIN):您聲明只能返回表ping中的行,其中表users中的值爲user_id。這就是爲什麼有額外的using檢查。

問題2:(LEFT JOIN):你說,它可以從表中返回所有行ping匹配從表usersuser_id任何行。

這裏的區別問題是您是否要求在第二個表中存在匹配值。在查詢1中,它必須添加額外的檢查,以確保在查詢2中存在匹配的值,但沒有。