2017-03-09 40 views
-1
select sum(a) from tbl1 where id in (1,2,3) (0.1 seconds) 

这两个mysql查询的性能有什么区别?

select sum(a) from tbl1 where id in (select id from tbl2) (60 seconds) 

select id from tbl2返回1,2,3 0.001秒;

tbl1大约有2.2M条目;

+1

临时表中缺少索引。 – arkascha

+2

您可能想查看执行计划,看看是否为每个ID执行'(select id from tbl2)'而不是在开始时执行一次 –

+0

运行查询'EXPLAIN select tbl1(sum)(a)where where id in(select id从tbl2)'并发布结果。 – nos

回答

0

这种情况发生在mysql < 5.5。似乎有一个导致查询时间过长的错误。解决方案si在tmp2.id上添加索引或升级到更高版本的mysql。

0

(1,2,3)是代码运行时已知的事情,而第二个示例是来自另一个表的查询,后者需要更多的查询是非常正常的。但是,600x慢度需要一些进一步的解释。如果没有你的情况的更多信息,我们只能猜测,但潜在的问题如下:

  • 有第二表中的许多IDS和多条记录中的第一个表
  • 内部查询每个运行外部查询(很有可能)
  • 缺少你列的索引的记录中使用过滤

如果内部查询的结果应该是类似于第一个例子中的设置,那么你可能要分开你的疑问分为两部分。您可以单独加载标识,然后将结果用于第二个查询。