G-day
我对以下几点感到困惑。当我运行这个查询时,它需要很长的时间来解决:
Select *
from test
where id in (select id from test2 where customer = 'HARRY');当我单独运行子查询时,它会在一秒钟内解析为'13454‘。当我将主查询的where语句改为in ('13454')时,它也会立即解析。
有人知道为什么它不能以原始格式运行吗??
干杯,
Rene
发布于 2013-04-18 09:29:27
原因是MySQL的一个怪癖。对外部表的每一行执行子查询。
要解决此问题,请使用exists
Select *
from test
where exists (select id from test2 where test2.customer = 'HARRY' and test2.id = test.id);如果您在test2(customer, id)上有一个索引,这将是最有效的。
我应该补充说,这取决于MySQL的版本(我认为它在5.5中得到了修复)。较老的documentation解释为:
考虑以下子查询比较:
选择输入(SELECT inner_expr FROM ... )其中subquery_where)
MySQL“从外到内”对查询进行求值。也就是说,它首先获取外部表达式outer_expr的值,然后运行子查询并捕获它生成的行。
发布于 2013-04-18 09:27:55
使用JOIN
SELECT DISTINCT a.*
FROM Test a
INNER JOIN Test2 b
ON a.ID = b.ID
WHERE b.customer = 'Harry'为了获得更快的性能,请确保两个表上的ID都安装了KEY。
https://stackoverflow.com/questions/16073005
复制相似问题