在 SELECT 中使用 SUM() 更好还是在 SUB-SELECT 中使用?
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
需要注意的是,我有两个table:table1(posts),table2(票)。以上两个查询是为了计算每个 post.
的总票数
那么,哪个更快更优化?
通常第一个更好,但这取决于 table 大小和您过滤数据的条件。
如果您能够在子查询中过滤数据,那么它会很快,但在您的情况下,似乎第一个查询会更好,因为您在子查询中没有进行太多数据过滤。
注意:如果您只想获得普通结果,则应使用普通连接而不是左连接,因为您可以获得性能。
如果你想知道哪个查询更优化,你可以使用解释命令
喜欢
'将 select t1.*, sum(t2.value) 解释为 total_votes
来自表 1 t1
左连接 table2 t2
在 t1.id = t2.post_id'
解释命令显示 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;
当您的 where
and/or order by
子句仅包含对 table1
的引用时,这尤其有效。
我有两个结果相同的查询,现在我想知道哪个更优化?
在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
需要注意的是,我有两个table:table1(posts),table2(票)。以上两个查询是为了计算每个 post.
的总票数那么,哪个更快更优化?
通常第一个更好,但这取决于 table 大小和您过滤数据的条件。
如果您能够在子查询中过滤数据,那么它会很快,但在您的情况下,似乎第一个查询会更好,因为您在子查询中没有进行太多数据过滤。
注意:如果您只想获得普通结果,则应使用普通连接而不是左连接,因为您可以获得性能。
如果你想知道哪个查询更优化,你可以使用解释命令
喜欢 '将 select t1.*, sum(t2.value) 解释为 total_votes 来自表 1 t1 左连接 table2 t2 在 t1.id = t2.post_id'
解释命令显示 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;
当您的 where
and/or order by
子句仅包含对 table1
的引用时,这尤其有效。