2012-07-01 72 views
0

我只是不太確定這樣做的正確方法。我基本上有2張桌子。兩個表都有相同的結構。 Database1(當前數據平均20k行),Database2(數據累積,在任何給定時間可以超過1密耳行)。mySQL - 比較錶行

我想比較這兩個表,並給我從Database1中得到的結果,該結果在具有特定時間戳查詢的Database2中不存在。我所擁有並嘗試過的查詢需要很長時間才能進行搜索。

嘗試:

select distinct player from Database1 
where not exists (select player from Database2 where snap = 1340981695) 

SELECT Database1.player FROM Database1 
INNER JOIN Database2 ON Database1.player NOT IN (Database2.player) AND Database2.snap = 1340981695 
GROUP BY Database1.player 

select distinct Database1.player from Database1 
left join Database2 on Database1.player not in (Database2.player) 
and Database2.snap = 1340981695 

我還是不能讓我的頭纏着這一點。感謝您的幫助。

+0

請顯示您的表格結構和索引 – Cfreak

+0

這兩張表的主鍵都有id,player,castle,xaxis,yaxis,snap和id。沒有數據是永遠不變的,當數據產生並放到Database1中時,數據總是變化的(從Database1添加到Database2中(從Database1中複製並始終累加) – sgkdnay

+0

有沒有真正快速的方法來做到這一點。在'player'和'snap'上應該有助於加入'id'(假設它們在表格中匹配)。你可能會更好地拋棄所有的數據平面文件並編寫一個程序來解析它以找出差異grep可能會這樣做很快),一旦你這樣做,你應該重新考慮你的數據庫設計.MySQL在1M +行表中是不錯的。爲什麼需要2? – Cfreak

回答

2

有三種方法。在performance大致順序,從最好到最差:

  1. 使用外連接:

    SELECT Database1.* 
    FROM Database1 
        LEFT JOIN Database2 
         ON Database1.id = Database2.id AND Database2.snap = 1340981695 
    WHERE Database2.id IS NULL 
    
  2. 使用IN

    SELECT * 
    FROM Database1 
    WHERE id NOT IN (SELECT id FROM Database2 WHERE snap = 1340981695) 
    
  3. 使用EXISTS

    SELECT * 
    FROM Database1 
    WHERE NOT EXISTS (
         SELECT * 
         FROM Database2 
         WHERE id = Database1.id AND snap = 1340981695 
         ) 
    
+0

嵌套查詢是最糟糕的想法。我不認爲在任何情況下都可以得到任何表現。最好不要使用它們。 –

+1

建議您閱讀@ Quassnoi的博客文章,我將其鏈接到;上述第二種方法與外連接性能相似。 – eggyal

+0

該文章假設一些特殊情況,如特定列上的索引。我的建議是鼓勵人們編寫嵌套查詢,如果沒有它們,很容易就可以做到。 –