性能明智,哪個更好?
如果我的查詢中有3個或4個join
語句,或者使用嵌入的select
語句作爲一個查詢的一部分從我的數據庫中提取相同的信息?更好的是:連接或多個子選擇語句作爲一個查詢的一部分
4
A
回答
2
我要說的連接是更好,因爲:
- 它們更易於閱讀。
- 你必須對你是否希望做更多的控制內,左/右向外聯接或完整外部聯接
- 加入語句不能這麼容易被濫用,以創建查詢可憎
- 與加入它是容易爲查詢優化器創建一個快速查詢(如果內部選擇很簡單,它可能會工作得一樣,但更復雜的東西連接會更好地工作)。
- 嵌入式
select
的只能模擬left/right outer join
。
有時你可以使用連接,在這種情況下(只有這樣)你必須依傍內選擇不去做的東西。
-1
大多數數據庫將在下面同時優化查詢到相同的計劃,所以無論你做:
select A.a1, B.b1 from A left outer join B on A.id = B.a_id
或
select A.a1, (select B.b1 from B where B.a_id = A.id) as b1 from A
它結束了是相同的。但是,在大多數情況下,對於非平凡查詢,只要可以,最好堅持使用連接,特別是因爲某些類型的連接(例如內連接)不可能使用子選擇來實現。
1
它取決於你的數據庫:表的大小,特別是內存參數,有時甚至是如何索引表。
在比當前版本的MySQL更少的情況下,具有子選擇的查詢的實際可能性比查詢返回結果相同的結果慢得多。 (在MySQL 4.1中,我看到差異大於一個數量級。)因此,我更喜歡使用聯接來構建查詢。
也就是說,有一些類型的查詢非常難以使用連接來構建,並且子選擇是真正實現它的唯一方法。
-1
假設數據庫引擎完全沒有優化,我會說這取決於你需要你的數據的一致性。如果您在繁忙的數據庫上執行多條SELECT
聲明,您所查看的數據可能會迅速變化,那麼您可能會遇到數據不匹配或查詢之間不匹配的問題。
假設您的數據不包含相互依賴關係,那麼多個查詢將正常工作。但是,如果您的數據需要一致性,請使用單個查詢。
這個觀點歸結爲保持您的數據事務安全。考慮一下您必須提取所有應收賬款的情況,這些應收賬款保存在與貨幣交易金額不同的表格中。如果有人要在兩次查詢之間添加另一筆交易,則應收帳款總額不會與交易金額的總額相符。
相關問題
- 1. 子查詢的列數太多;多個選擇在一個選擇語句
- 2. 「選擇語句中的最小值」或DMin()。哪一個更好?
- 3. 寫一個選擇語句查詢
- 4. SQL - 多個查詢或一個連接
- 5. 需要連接一個子查詢的結果SELECT語句
- 6. SQL在一個查詢中有多個選擇計數語句
- 7. 內部連接與多個表上的選擇語句
- 8. 多個動態選擇語句的內部連接
- 9. 將count(*)作爲選擇查詢的一部分是錯誤的
- 10. 只讓一個句子成爲鏈接的一部分(添加選擇器)
- 11. 更新選擇語句多連接
- 12. 從Select語句創建一個視圖與多個子查詢/連接
- 13. 選擇多行與一個子查詢
- 14. 根據多個選擇語句查詢用戶的百分比
- 15. 哪一個更快:相關的子查詢或連接?
- 16. MySQL的:左連接和內部連接在一個子查詢
- 17. SQLite:多選擇語句與一個選擇語句
- 18. 選擇一對多哪一個更好
- 19. 一個更好的方法來寫這個MySQL選擇查詢
- 20. 獲取第一個或最後一個結果作爲連接的一部分
- 21. 性能方面:是它更好地使用內部連接或打開新的連接/另一個查詢
- 22. 選擇一個表或數組一個更大的選擇查詢
- 23. mysql更新選擇語句與多個表和左外連接
- 24. BigQuery - 使用子查詢和OR語句連接多個條件
- 25. 在一個語句中選擇兩個表的連接中的第一行
- 26. 插入值:準備好的語句或多個值的查詢?
- 27. 多個WHERE語句的子查詢...
- 28. 多選擇在一個SQL語句
- 29. 哪一個是更好的查詢
- 30. 如何在一個SQL查詢中連接兩個SELECT語句?
-1這不解釋內部連接等。 – Johan 2011-04-26 23:56:05
我不知道我理解你的評論,我應該如何解決答案,使其正確? – 2011-04-27 00:00:37
你只做過一種類型的連接,但是OP一般都在談論連接。因此,內部連接的示例代碼會很好,因爲*(純粹爲自己說話)*這是連接(i)最經常使用的。如果你所能做的只是留下外部連接,這使得非常扼殺代碼'選擇一個,從x內部連接混合,並選擇這樣:-) – Johan 2011-04-27 00:04:13