2013-05-13 144 views
1

如果我有2個表員工部門這是在性能客戶端更好地連接或服務器端連接

1)在服務器端

SELECT * FROM employee CROSS JOIN department; 

我們只用連接數據一個連接在這裏抓取數據

2)在客戶端加入數據我們將抓取2個表並使用2個連接

SELECT * FROM employee; 

並將其存儲在一個陣列,並且還

SELECT * FROM department; 

並將其存儲在另一個數組和,並使用例如Java腳本在客戶端側通過編程合併2個陣列。

第二種方法可能更復雜,但優點是您可以將employee表存儲在一臺服務器上,並將部門表存儲在另一臺服務器上,這樣可以減少您自己的服務器上的負載,並使每臺客戶機執行其操作工作

但是我問,如果我想參加2000表這將是更好的性能和更快:做在客戶端或服務器端連接?

+1

這是多麼糟糕的一組標籤。請關注* one *數據庫方法。在任何情況下,**執行加入服務器總是更好**(多年的優化,智能查詢計劃,索引使用,多重聯接實現,更少的請求,更小的數據傳輸等) - 我將不得不有一個非常具體的案例(由經驗證據支持),然後我決定採取不同的做法。按照他們的意圖使用這些工具。 (但是,這個簡單的CROSS JOIN - ick! - 在這個問題上引發了一些小問題。) – user2246674 2013-05-13 21:38:59

+0

爲什麼這個問題標記爲MongoDB? – vinipsmaker 2013-05-13 21:45:58

+0

我打算將關聯數據作爲文檔存儲在MongoDB中的集合中,並在客戶端進行連接 – 2013-05-13 21:48:55

回答

4

好問題(雖然有不好的標籤,正如已經指出的那樣)。

的加盟肯定會在服務器上更快,如果做了,但如果每個表剛剛1,000行結果集是1,000,000行,而那些必須發送回客戶端。如果你加入客戶端,你只能發回2000行。根據你在客戶端需要做的事情,可能值得做單獨的查詢來減少客戶端和服務器之間的流量。再次,用JavaScript加入這兩套也不會很快。

所以,這裏的軟糊糊的答案:這一切都取決於結果集的大小;你必須嘗試。

請注意此答案僅適用於CROSS JOIN。所有其他的連接類型最好在服務器上完成,毫無疑問。

+1

+1這對於CROSS JOIN絕對是正確的。 – 2013-05-13 22:00:29

2

在大多數情況下,它遠遠不如做服務器端的連接。

在客戶端執行連接需要將所有全部數據從兩個表傳輸到客戶端,即使連接條件隨後會消除這兩個表中的大部分行也是如此。您將爲每個此類查詢浪費大量網絡帶寬。

還要注意的是連接在服務器端應該是更好的性能,因爲他們可以使用索引來查找匹配的行。如果您將數據存儲在客戶端的數組中,則您無法從索引查找中獲益。最好的辦法是確保兩個數組都按其各自的連接列進行排序,然後您可以一次完成連接。

你是對的,在客戶端執行連接允許你連接位於不同服務器上的表,但我會聲稱,如果你有相關的有效數據加入,它應該保持不變服務器。不僅支持連接,而且還支持引用完整性,交易等

PS:我不知道爲什麼你標記的MongoDB和NoSQL你的問題。你的問題似乎與非關係數據庫無關。

PPS:從@EdGibbs答案提醒我,你提出的CROSS JOIN作爲替代。使用CROSS JOIN應該是一件非常難得的事情,可能不是你想要的部門和員工的例子。您將改爲使用連接來標識匹配項,即屬於給定部門的員工。