回答
在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