2014-01-29 57 views
0

什麼是最佳解決方案,使用Inner Join還是多個查詢?什麼是最佳解決方案,使用Inner Join還是多個查詢?

像這樣:

SELECT * FROM brands 
INNER JOIN cars 
    ON brands.id = cars.brand_id 

或像這樣:

SELECT * FROM brands 

...(同時查詢)...

SELECT * FROM cars WHERE brand_id = [row(brands.id)] 
+2

我們需要一些上下文,作爲向db發佈命令的一般規則,並且獲得結果非常昂貴。最好做一個命令,一次獲取所需的所有數據。 – Liath

+0

從來沒有在循環中查詢數據庫 – bring2dip

+0

我很難想出一種情況,您想要進行多個查詢而不是單個JOINed查詢。 –

回答

1

一般情況下,請使用第一個查詢。爲什麼?由於查詢執行時間不只是查詢本身的時間,但也有一些開銷,比如:

  • 創建連接開銷
  • 網絡數據發送開銷
  • 關閉(處理)連接開銷

根據情況,可能會出現一些開銷。例如,如果你使用持久連接,那麼你不會得到連接開銷。但在一般情況下,這是不正確的,因此,它會有地方。創建/維護/關閉連接開銷是非常重要的部分。想象一下,由於總查詢時間只有1%(在實際情況下,它會更多),所以你有這個開銷。你有 - 我們說,有1000,000行。然後第一個查詢將只產生一次開銷,而第二個將是1.000.000/100 = 10.000次。試想一下 - 它會有多慢。

此外,INNER JOIN還將使用鍵完成 - 如果它存在,因此,在查詢方面本身速度將接近同第二。所以我強烈建議使用INNER JOIN選項。

打破複雜查詢到簡單的查詢可以在非常特殊的情況下非常有用。例如,IN子查詢的情況。在這種情況下,如果你使用WHERE id IN (subquery),其中(subquery)是一些SQL,MySQL將對待,作爲= ANY子查詢,也不會使用該密鑰,即使IDS的窄列表子查詢結果。而且 - 是的,把它分成兩個查詢可能具有意義,因爲WHERE IN(static list)將用另一種方法 - MySQL將使用範圍索引掃描是(奇怪,但真正的 - 因爲IN (static list)聲明IN將被視爲比較運算,而不是=ANY子查詢預選賽)。這部分不是直接關於你的情況 - 而是爲了表明 - 是的,從數據庫管理系統中分離處理可能對性能有用的情況存在。

2

這是一個非常主觀的問題,但請記住,每次你cal l數據庫存在很大的開銷。

幾乎毫無例外,最佳的方式是發出儘可能少的命令並提取所有需要的數據。然而,由於實際的原因,這顯然不可能。

一般來說,如果數據庫維護得當,一個查詢比兩個查詢快。如果不是,你需要看看你的數據/痕跡並確定原因。

最後一點,您在第二個例子中暗示您會加載品牌,然後發出命令以獲取每個品牌中的所有汽車。這毫無疑問是你最糟糕的選擇,因爲它不發出2個命令 - 它發出N + 1,其中N是你擁有的品牌數量...... 100個品牌是101個數據庫命中!

3

一般來說,一個查詢更好,但有一些警告。例如,如果您執行了七次以上的連接,則較早版本的SQL Server性能會大幅下降。答案將取決於數據庫引擎,版本,查詢,模式,字段等,所以我們無法確定哪個更好。在可能的情況下總是儘量減少查詢次數,而不要太過分,並創建瘋狂或無法維護的結果集。

2

你的兩個查詢不完全一樣。

第一個返回從一行中的brandscars的所有字段。第二個返回需要組合在一起的兩個不同的結果集。

一般而言,最好在數據庫中儘可能多地執行操作。數據庫對於處理大量數據更有效。而且,它通常會減少返回給客戶端的數據量。

也就是說,有一些情況下,單個查詢中返回的數據多於多個查詢。例如,在您的示例中,如果您有一個包含100列的品牌記錄和包含三列的10,000條汽車記錄,那麼雙查詢方法可能會更快。您只能從brands表中取回一次而不是10,000次。

這些多個查詢更好的例子很少。一般來說,最好在數據庫中進行處理。如果性能需要改進,那麼在少數情況下,您可能會分解查詢並提高性能。

1

一個查詢比較好,因爲到執行查詢的費用約90%是在開銷:

  • 通信流量/從數據庫
  • 語法檢查
  • 權限檢查
  • 優化器訪問計劃計算
  • 日誌記錄
  • 鎖定(即使只讀也需要鎖定)
  • 很多其他的東西太多

做的一切只是一次一個查詢,或做這一切n次了N次查詢,但得到了同樣的數據。

+0

這個問題是不必要的數據量VS處理時間。我正在做一些測試,並且只有一個查詢返回大量不必要的數據時,多個查詢只能管理一個最佳時間。 (我使用網站plataform進行測試 - PHP + Postgree) – fcfeitosa

相關問題