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

时间:2015-09-18 09:51:15

标签: mysql sum subquery

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

在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)。以上两个查询用于计算每个帖子的总票数。

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

3 个答案:

答案 0 :(得分:1)

通常第一个更好,但它将取决于表格大小和您过滤数据的条件。

如果您能够在子查询中过滤数据,那么它可以很快,但在您的情况下,首先查询会更好,因为您在子查询中没有做太多的数据过滤。

注意:如果你想获得普通的结果,那么应该使用普通连接而不是左连接,因为你可以获得性能。

答案 1 :(得分:1)

如果您想了解更优化的whitch查询,可以使用explain命令

像 '解释选择t1。*,sum(t2.value)为total_votes 来自table1 t1 左连接table2 t2 在t1.id = t2.post_id'

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

如果你知道这个查询命令显示这个页面

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

答案 2 :(得分:0)

据推测,您打算将第一个查询设为:

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;

如果where和/或order by条款仅包含对table1的引用,则此功能尤其有效。