这两个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
我知道这些信息不多。只是想知道何时使用子查询并加入子查询,并了解它们之间的区别。
由于
答案 0 :(得分:0)
这是一个很好的问题,但我还会添加第三个选项(更标准的方法):
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
为空或主题很少,则第二个是最好的。