2014-04-01 59 views
1

我有一個包含許多表的大型數據庫。其中一些表格可能包含email字段。它們都是varchar(255)的相同類型。我希望能夠做的是將所有表格與電子郵件列一起加入,並獲取數據庫中所有唯一電子郵件的列表。MySQL在共同列上加入多個表格,沒有重要性排序

我的問題是會有多個表與該列,所以我需要它是高性能。第二個問題是afaik,將表連接在一起意味着它們必須具有從第一個表到連接表的共同值。

我希望能夠做一些事情,如:

SELECT 
    email 
FROM 
    table_1 
LEFT JOIN 
    table_2 
USING (email) 
LEFT JOIN 
    table_3 
USING (email) 

不過,我希望能夠得到來自所有表的電子郵件,無論他們是否在其他表中存在的。

在臨時表中的所有表上進行聯合選擇並選擇不同於它會更快嗎?

我需要能夠在很多表格(10+)上做到這一點,其中可能有數千到數百萬行。如果需要,我會將電子郵件列設置爲INDEX。

感謝

+0

'OUTER JOIN'不需要相同的值在其他表中,但是由於db必須處理'N^T'結果行,因此計算量很大,其中N是電子郵件數量,T是表格數量。 –

回答

4

如果你想從所有的表,其中包括電子郵件,只發生在一個表中是唯一的郵件,你應該使用UNION代替JOIN

SELECT DISTINCT email FROM table_a 
UNION SELECT DISTINCT email FROM table_b 
UNION SELECT DISTINCT email FROM table_c 
... 
+0

我看,看起來像我將不得不作爲我的左連接查詢沒有按預期工作。因爲表的規模,UNION會更快,然後UNION ALL和GROUP BY電子郵件? – Ozzy

+0

@Ozzy你可能需要對它進行基準測試,看看哪個更快。 – Vatev

+0

我認爲最簡單的查詢將是數據庫引擎優化的最簡單的方法。這就是說基準非常重要,因爲工會通常比其他數據庫功能更少關注。不同的實現可能會有所不同:)從概念上講,db必須遍歷每個表的電子郵件索引(如果沒有索引,則需要整個表),並保留已選電子郵件的地圖。如果您的數據集真的很龐大,那麼將所有電子郵件(不受限制限制)從數據庫流出並遠程分析用戶代碼(在另一臺計算機上)的結果可能會更快。 –

相關問題