[英]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如何执行查询。
如果您知道此查询命令,请显示此页面
假设您希望第一个查询为:
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.