我有两个查询具有相同的结果,现在我想知道哪一个更优化了?
在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)。以上两个查询用于计算每个帖子的总票数。
那么,哪一个更快,更优化?
答案 0 :(得分:1)
通常第一个更好,但它将取决于表格大小和您过滤数据的条件。
如果您能够在子查询中过滤数据,那么它可以很快,但在您的情况下,首先查询会更好,因为您在子查询中没有做太多的数据过滤。
注意:如果你想获得普通的结果,那么应该使用普通连接而不是左连接,因为你可以获得性能。
答案 1 :(得分:1)
如果您想了解更优化的whitch查询,可以使用explain命令
像 '解释选择t1。*,sum(t2.value)为total_votes 来自table1 t1 左连接table2 t2 在t1.id = t2.post_id'
explain命令显示了MySQL如何执行查询。
如果你知道这个查询命令显示这个页面
答案 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
的引用,则此功能尤其有效。