select sum(a) from tbl1 where id in (1,2,3) (0.1 seconds)
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条目;
select sum(a) from tbl1 where id in (1,2,3) (0.1 seconds)
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条目;
这种情况发生在mysql < 5.5。似乎有一个导致查询时间过长的错误。解决方案si在tmp2.id上添加索引或升级到更高版本的mysql。
(1,2,3)
是代码运行时已知的事情,而第二个示例是来自另一个表的查询,后者需要更多的查询是非常正常的。但是,600x慢度需要一些进一步的解释。如果没有你的情况的更多信息,我们只能猜测,但潜在的问题如下:
如果内部查询的结果应该是类似于第一个例子中的设置,那么你可能要分开你的疑问分为两部分。您可以单独加载标识,然后将结果用于第二个查询。
临时表中缺少索引。 – arkascha
您可能想查看执行计划,看看是否为每个ID执行'(select id from tbl2)'而不是在开始时执行一次 –
运行查询'EXPLAIN select tbl1(sum)(a)where where id in(select id从tbl2)'并发布结果。 – nos