繁体   English   中英

在SELECT中还是在SUB-SELECT中使用SUM()更好?

[英]Using SUM() in the SELECT is better or in the SUB-SELECT?

我有两个查询结果相同的查询,现在我想知道哪个查询更优化了?

在SELECT中

select t1.*, sum(t2.value) as total_votes
from table1 t1
left join table2 t2
on t1.id = t2.post_id

在SUB-SELECT中:

select t1.*, t3.total_votes
from table1 t1
left join (select post_id, sum(value) as total_votes from table2 t2 group by post_id) t3
on t1.id = t3.post_id

应该注意的是,我有两个表:table1(posts),table2(votes)。 以上两个查询用于计算每个帖子的总投票数。

那么,哪个更快,更优化?

通常情况下,首先比较好,但这取决于表的大小以及要过滤数据的条件。

如果您能够在子查询中过滤数据,则速度会很快,但在您的情况下,由于您在子查询中没有进行大量数据过滤,因此似乎第一个查询会更好。

注意:如果要获得普通结果,则应使用普通联接而不是左联接,这样可以提高性能。

如果您想知道鞭子查询是更优化的,则可以使用explain命令

就像“解释选择t1。*,将sum(t2.value)作为table1 t1中的total_votes一起加入t1.id = t2.post_id上的table2 t2”

说明命令显示了MySQL如何执行查询。

如果您知道此查询命令,请显示此页面

http://dev.mysql.com/doc/refman/5.6/en/explain.html

假设您希望第一个查询为:

select t1.*, sum(t2.value) as total_votes
from table1 t1 left join
     table2 t2
     on t1.id = t2.post_id
group by t1.id;

除了检查查询和数据的性能外,对您的问题没有正确的答案。 为什么? 您正在进行两个竞争的事情:优化联接和优化聚合。

第一个查询可以使用索引进行连接-这样可以提高效率。 但是,聚合可能有很多数据,这是一个问题。

第二个可以进行聚合-可能只对很少的数据(假设t2有一行)进行聚合,但是join可能无法充分利用索引。 其他数据库具有用于联接和聚集的更强大的算法。 但是在MySQL中,您确实需要测试。

有第三个版本通常可以比以下任何一个版本更好地工作:

select t1.*, 
       (select sum(t2.value)
        from table2 t2
        where t1.id = t2.post_id
       ) as total_votes
from table1 t1;

当您具有仅包含对table1引用的where和/或order by子句时,这特别有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM