2013-04-10 185 views
0

我對過去7天的問題感到困惑。我搜索了很多,也探討了SO,但找不到滿意的答案。我們應該避免使用LEFT JOIN

我想澄清我的概念左加入。因爲我們知道LEFT JOIN從右表中返回所有的值,並通過右表返回加入的值(通過外鍵)。現在,如果右表中有10個值指向左表中的主鍵,那麼LEFT JOIN將從右表中重複第一個表值10次,同時給出右表中的值。這只是一個例子。它是否有效,或者我不應該擔心它嗎?

這裏是重複的示例值

enter image description here

我強調重複的值。 其實,我有一個表,我想用LEFT JOIN從同一個表中獲取子註釋。行可能在100s而不是在1000s。我有相關領域的索引。所以,請引導我(記住LEFT JOIN從左起反覆排列的本地行爲),我應該擔心它嗎?並且它是否大部分使用?

回答

0

性能是否有效?或者我應該不擔心嗎?

這是一個我只能指回自己的問題。這些問題只是非常主觀的,不能以一般方式回答。

這也是爲什麼你沒有在谷歌上找到一個簡單的答案的原因。

我可以給出的最佳答案是:與您的數據庫性能顧問聯繫並與她討論問題。在向她提供足夠的信息並訪問測試平臺後,她應該能夠明確地回答您的問題。

1

它權衡的問題...

首先,貴外連接的查詢執行呢?鑑於你展示的例子,它應該,如果你使用索引字段來映射外鍵關係。使用EXPLAIN來確定您是否確實在使用索引字段,並在需要時優化查詢。

如果查詢本身速度很快,那麼下一個問題是您要在數據庫和應用程序服務器之間發送比您需要的數據略多一些的數據 - 來自左側表的重複數據。雖然不理想,但我懷疑你可以衡量差異,除非你真的在大量工作。如果您要發送數百條記錄,並且每個記錄有幾個額外的字節,那麼如果網絡無法跟上,那麼您的問題會比外部連接多得多。

最後,你必須考慮替代方案。使用外部聯接,即使由於聯接而稍慢,您也可以在單個查詢中檢索所有匹配的數據。另一種方法是獲取所有父記錄,循環遍歷它們並找到匹配的子項。這將遠遠慢得多 - 而不是一個查詢,您將執行數十個或數百個(根據您處理「數百個,而不是數千個記錄」的語句)。每個查詢都有開銷,並且總之,開銷可能遠遠超過額外的「加入」語句成本。

但是,找出最好的方法是使用像DBMonster這樣的工具,加載一個測試數據庫,其數據量比您以前想象的要多10倍,然後試用。

0

有關bandwith的最高性能解決方案是在一回閤中獲得標題,並在第二回閤中獲得所有的孩子。讓他們留在記憶中,並自己加入。這通常是一個「壞主意」,因爲它不能很好地擴展(想象一下,在單個服務器上的多個會話的內存要求都會對不斷擴展的數據集執行此操作),但是如果可以保持數據集不變並且網絡真的這不好,這是一個可行的選擇。

最終答案:是的,你理解正確。這通常很好,但有一種方法。

0

如果我正確理解你,你所描述的只是一個左內連接的工作原理。

您是否必須使用左連接來獲取子註釋?是否有另一種方法可以使用?也許(這完全是關閉的,沒有研究)使用1個查詢來獲得父註釋,另一個查詢子註釋並將結果聯合在一起?

相關問題