回答
在MySQL
,Oracle
,SQL Server
和PostgreSQL
,NOT EXISTS
是相同的效率或甚至比LEFT JOIN/IS NULL
更有效。
雖然看起來「應該爲外部查詢中的每個記錄執行內部查詢」(這似乎對NOT EXISTS
不利,對於NOT IN
更糟糕,因爲後面的查詢甚至沒有關聯),它可能使用適當的anti-join
方法進行優化,同時優化所有其他查詢。
在SQL Server
中,實際上,LEFT JOIN/IS NULL
在內表中未指定索引或低基數列的情況下可能效率低於NOT EXISTS/NOT IN
。
人們經常聽說MySQL
「在處理子查詢時尤其糟糕」。
這源於MySQL
除了嵌套循環之外無法使用任何連接方法,這嚴重限制了它的優化能力。
當查詢將從此改寫子查詢的加入將是受益的唯一情況:
SELECT *
FROM big_table
WHERE big_table_column IN
(
SELECT small_table_column
FROM small_table
)
small_table
不會被查詢完全在big_table
每個記錄:雖然似乎是相關不,它會通過查詢優化器,並在事實上改寫成EXISTS
(使用index_subquery
如果需要搜索第一多,如果small_table_column
被索引)
但big_table
將永遠是領先的,這使得T爲含蓄地相關他在big * LOG(small)
查詢完成而不是small * LOG(big)
讀取。
這可以被改寫爲
SELECT DISTINCT bt.*
FROM small_table st
JOIN big_table bt
ON bt.big_table_column = st.small_table_column
然而,這並不會提高NOT IN
(相對於IN
)。在MySQL
,NOT EXISTS
和LEFT JOIN/IS NULL
幾乎是相同的,因爲使用嵌套循環左表應該始終在LEFT JOIN
領先。
您可能需要閱讀這些文章:
它可能與優化過程有關...不存在意味着子查詢,「優化器」通常不會執行子查詢正義。另一方面,加入可以更容易地處理...
我認爲這是一個MySQL的具體情況。 MySQL不優化IN /中的子查詢,而不是在/ any/not exists子句中,並且實際上爲外部查詢匹配的每一行執行子查詢。由於MySQL中的這一點,您應該使用連接。然而,在PostgreSQL中,你可以使用子查詢。
- 1. 這是很好的鏈接練習嗎?
- 2. 使用document.on()會被認爲是不好的做法嗎?
- 3. 正在使用System。*您自己班上的命名空間被認爲是不好的練習?
- 4. 是否將Page.Master轉換爲MasterPage類型以訪問/修改被認爲是不好的練習的控件?
- 5. 在python不好的練習中是unicode標識符嗎?
- 6. 練習從3.3認爲Python
- 7. 好的JavaScript練習?
- 8. 在Windows上練習SQL的好軟件?
- 9. SQL查詢被認爲是慢的嗎?
- 10. 好的android網絡練習
- 11. 這是一個很好的React練習嗎?
- 12. 這是使用iframe的好習慣嗎
- 13. VHDL中的<= a + 1是一個很好的練習嗎?
- 14. 設計練習最好使用mfc
- 15. CORS被認爲是不好的做法嗎?
- 16. 哪一個是更快/更好的sql練習?
- 17. ViewModel對象持有Dispatcher被認爲是不好的做法嗎?
- 18. 使用GNUStep編寫Windows應用程序被認爲是不好的做法嗎?
- 19. 這會被認爲是不好的RESTFul設計嗎?
- 20. 這在C#中被認爲是不好的做法嗎?
- 21. 這會被認爲是良好的編程習慣,當使用KVO
- 22. SQL連接練習
- 23. 在SQL(SQLZoo練習)
- 24. 使用非標準HTML屬性被認爲是不好的做法嗎?
- 25. 使用多個標題標籤被認爲是「不好的做法」嗎?
- 26. SQL DML練習10
- 27. SQL-EX.ru練習#36
- 28. 使用幻數是好習慣嗎?
- 29. sql dml練習19
- 30. 練習SQL查詢
@duffymo:所有猜測都錯了。 – Quassnoi
這是爲什麼關閉?我也很好奇原因。 –
@Ziayo:可能是因爲「很多人」這個詞。如果措辭「比」不存在「更有效率,那麼這將是一個完美的問題,可以用」事實,參考或具體的專業知識「來解釋。 – Quassnoi