当前位置: 首页 > 面试题库 >

内部联接和in()子句的性能在哪里?

葛勇锐
2023-03-14
问题内容

对于这些查询,我可以获得相同的结果,但是哪一个是最快,最有效的?

in()或内部联接在哪里?

SELECT `stats`.`userid`,`stats`.`sumpoint` 
FROM  `stats` 
INNER JOIN users
ON `stats`.`userid` = `users`.`userid` 
WHERE `users`.`nick` =  '$nick'

ORDER BY `statoylar`.`sumpoint` DESC  limit 0,10

SELECT `stats`.`userid`,`stats`.`sumpoint` 
FROM  `stats` 
WHERE userid
IN (
SELECT userid
FROM  `users` 
WHERE  `users`.`nick` =  '$nick'
)
ORDER BY `stats`.`sumpoint` DESC  limit 0,10

问题答案:

取决于您的SQL引擎。具有合理查询优化器的较新SQL系统很可能会将两个查询重写为同一计划。通常,使用联接(第一个查询)重写子查询(第二个查询)。

在可能没有出色查询优化器的简单SQL引擎中,联接应该更快,因为它们可能在运行外部查询之前将子查询运行到临时内存表中。

但是,在某些内存占用空间有限的SQL引擎中,子查询可能会更快,因为它不需要连接-这样会产生更多数据。

因此,总而言之,这取决于。



 类似资料:
  • 我有一个查询,以获得用户的朋友的数据。我有三个表,一个是user表,第二个是user_friend表,它有user_id和friend_id(都是user表的外键),第三个表是feed表,它有user_id和feed内容。饲料可以给朋友看。我可以通过两种方式查询,要么通过join查询,要么通过使用子句查询(我可以通过graph数据库获取所有朋友的ID,我正在使用它进行网络连接)。 以下是两个查询:

  • 问题内容: 我在定义为左外部联接的两个表上有一个联接,以便所有记录都从左表返回,即使它们在右表中没有记录也是如此。但是,我还需要在右侧表中的字段上包含where子句,但是....我仍然希望为左侧表中的每个记录返回左侧表中的一行,即使where子句中的条件不满足。有没有办法做到这一点? 问题答案: 是的,将条件(称为谓词)放入联接条件中

  • 问题内容: 我正在使用Hibernate 3.6和MSSQL 2012。 执行此HQL时 我正在获取此SQL 请注意 交叉连接 和where子句中的 附加条件* 。 根据Hibernate docs https://docs.jboss.org/hibernate/core/3.5/reference/en/html/queryhql.html#queryhql- joins- forms 隐式连

  • 问题内容: 我知道如何将列表映射到字符串: 而且我知道我可以使用以下命令将该字符串放入IN子句中: 我需要使用MySQLDB安全地完成同一件事(避免SQL注入)。在上面的示例中,由于foostring没有作为执行参数传递,因此它很容易受到攻击。我还必须在mysql库之外引用和转义。 (有一个相关的SO问题,但是那里列出的答案对MySQLDB不起作用或容易受到SQL注入的影响。) 问题答案: 直接使

  • 根据Hibernate文档https://docs.jboss.org/Hibernate/core/3.5/referen/html/queryhql.html#queryhql-joins-forms 隐式联接应生成为内部联接。 我注意到有一个打开的bug https://hibernate.atlassian.net/browse/hhh-7707可能提到了这个问题,但没有人回答,而且它已经

  • 我得到了下面的SQL,我想将其转换为有效的HQL。这方面的问题是,不允许根据文档加入子查询。尽管这些是旧文档(v3.3),但在hibernate 5.3中,这一节似乎仍然适用。 我想出了这个HQL: 尝试执行此HQL查询会导致此异常 这将提示 在. 有没有办法加入HQL中的子查询?如果不是,那么获得与具有HQL的SQL相同的结果的最佳方法是什么? 我不擅长转换