什麼是最佳解決方案,使用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)]
什麼是最佳解決方案,使用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)]
一般情況下,請使用第一個查詢。爲什麼?由於查詢執行時間不只是查詢本身的時間,但也有一些開銷,比如:
根據情況,可能會出現一些開銷。例如,如果你使用持久連接,那麼你不會得到連接開銷。但在一般情況下,這是不正確的,因此,它會有地方。創建/維護/關閉連接開銷是非常重要的部分。想象一下,由於總查詢時間只有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
子查詢預選賽)。這部分不是直接關於你的情況 - 而是爲了表明 - 是的,從數據庫管理系統中分離處理可能對性能有用的情況存在。
這是一個非常主觀的問題,但請記住,每次你cal l數據庫存在很大的開銷。
幾乎毫無例外,最佳的方式是發出儘可能少的命令並提取所有需要的數據。然而,由於實際的原因,這顯然不可能。
一般來說,如果數據庫維護得當,一個查詢比兩個查詢快。如果不是,你需要看看你的數據/痕跡並確定原因。
最後一點,您在第二個例子中暗示您會加載品牌,然後發出命令以獲取每個品牌中的所有汽車。這毫無疑問是你最糟糕的選擇,因爲它不發出2個命令 - 它發出N + 1,其中N是你擁有的品牌數量...... 100個品牌是101個數據庫命中!
一般來說,一個查詢更好,但有一些警告。例如,如果您執行了七次以上的連接,則較早版本的SQL Server性能會大幅下降。答案將取決於數據庫引擎,版本,查詢,模式,字段等,所以我們無法確定哪個更好。在可能的情況下總是儘量減少查詢次數,而不要太過分,並創建瘋狂或無法維護的結果集。
你的兩個查詢不完全一樣。
第一個返回從一行中的brands
和cars
的所有字段。第二個返回需要組合在一起的兩個不同的結果集。
一般而言,最好在數據庫中儘可能多地執行操作。數據庫對於處理大量數據更有效。而且,它通常會減少返回給客戶端的數據量。
也就是說,有一些情況下,單個查詢中返回的數據多於多個查詢。例如,在您的示例中,如果您有一個包含100列的品牌記錄和包含三列的10,000條汽車記錄,那麼雙查詢方法可能會更快。您只能從brands
表中取回一次而不是10,000次。
這些多個查詢更好的例子很少。一般來說,最好在數據庫中進行處理。如果性能需要改進,那麼在少數情況下,您可能會分解查詢並提高性能。
一個查詢比較好,因爲到執行查詢的費用約90%是在開銷:
做的一切只是一次一個查詢,或做這一切n次了N次查詢,但得到了同樣的數據。
這個問題是不必要的數據量VS處理時間。我正在做一些測試,並且只有一個查詢返回大量不必要的數據時,多個查詢只能管理一個最佳時間。 (我使用網站plataform進行測試 - PHP + Postgree) – fcfeitosa
我們需要一些上下文,作爲向db發佈命令的一般規則,並且獲得結果非常昂貴。最好做一個命令,一次獲取所需的所有數據。 – Liath
從來沒有在循環中查詢數據庫 – bring2dip
我很難想出一種情況,您想要進行多個查詢而不是單個JOINed查詢。 –