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

一笑奈何 提交于 2019-12-11 21:27:53

问题


I have two query with the same result, now I want to know which one is more optimized?

In the SELECT:

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

In the 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

It should be noted, I have two table: table1(posts), table2(votes). And the two above query are for calculating total votes for each post.

So, which one is faster and more optimized?


回答1:


Presumably, you intend for the first query to be:

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;

There is no right answer to your question, other than checking the performance on both queries and the data. Why? You have two competing things going on: optimizing the join and optimizing the aggregation.

The first query can use indexes for the join -- which makes that much more efficient. However, there may be lots of data for the aggregation, which is a problem.

The second can do the aggregation -- potentially on very little data (imagine that t2 has one row) -- but then the join may not be able to make full use of an index. Other databases have more powerful algorithms for joins and aggregations. But in MySQL, you really need to test.

There is a third version that can often work better than either of these:

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

This is particularly effective when you have where and/or order by clauses that only contain references to table1.




回答2:


Normally first is better, but it will be depend on table size and your conditions those are filtering data.

If you are able to filter data in sub-query then it can be fast but in your case it seems first query will be better as you are not doing much data filteration in your sub-query.

Note: If you want to get just common results then should use normal join instead of left join as you can get performance.




回答3:


If you want know whitch query is more optimized, you can use explain command

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

explain command is show how MySQL would execute a query.

if you know about this query command show this page

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



来源:https://stackoverflow.com/questions/32649019/using-sum-in-the-select-is-better-or-in-the-sub-select

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!