【问题标题】:What is the difference between subquery and a joined subquery?子查询和连接子查询有什么区别?
【发布时间】:2015-06-14 14:40:57
【问题描述】:

这两个mysql查询有什么区别

select t.id,
(select count(c.id) from comment c where c.topic_id = t.id) as comments_count
from topic;

与

select t.id,comments.count from topic
left join
(
   select count(c.id) count,c.topic_id from comment c group by topic_id
) as comments on t.id = comments.topic_id

我知道没有太多信息。只是想知道何时使用子查询和连接子查询以及它们之间的区别。

谢谢

【问题讨论】:

  • 您的第二个示例是连接到派生表。好处是派生表生成一次,基于集合。第一个相关子查询有可能在topic 表的每一行中执行一次
  • 所以你的意思是子查询可以检索单条记录?第二个用于检索列表?
  • @reverbnation 如果你想向 StuartLC 提问,你应该打电话给他@

标签: mysql subquery


【解决方案1】:

这是一个很好的问题,但我还要添加第三个选项(更标准的做法):

select t.id, count(c.topic_id) as count
from topic left join
     comment c 
     on t.id = c.topic_id
group by t.id;

第一种方式在 MySQL 中通常是最有效的。 MySQL 可以利用comment(topic_id) 上的索引来生成计数。这在其他数据库中可能也是如此,但在 MySQL 中尤其明显,它实际上不使用group by 的索引。

第二个查询进行聚合,然后进行连接。子查询被具体化,增加了额外的开销,然后join 不能使用comment 上的索引。它可能会使用topic 上的索引,但left join 可能会降低该选项的可能性。 (您需要检查环境中的执行计划。)

第三个选项相当于许多数据库中的第一个选项,但在 MySQL 中则不然。它连接到comment(利用comment(topic_id) 上的索引,如果可用)。但是,它会导致最终聚合的文件排序开销。

不情愿地,我必须承认,就 MySQL 的性能而言,第一选择通常是最好的,尤其是在正确的索引可用的情况下。如果没有索引,这三个中的任何一个都可能是最佳选择。例如,没有索引,如果comments 为空或主题很少,则第二个是最好的。

【讨论】:

  • 你的最后一段有点含糊。哪个更适合没有索引?哪个用于索引?
猜你喜欢
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2015-04-17
  • 2018-09-20
  • 2016-03-20
相关资源
最近更新 更多