G日,
我对以下内容感到有些困惑。当我运行此查询时,需要很长时间才能解决:
Select *
from test
where id in (select id from test2 where customer = 'HARRY');
当我自己运行子查询时,它很快就会解析为“13454”。当我将主查询的 where 语句更改为 in ('13454') 时,它也会立即解决。
有人知道为什么它不会以原始格式运行吗?
干杯,
雷内
原因是 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 中已修复)。较旧的文档将其解释为:
考虑以下子查询比较:
outer_expr IN (SELECT inner_expr FROM ... WHERE subquery_where)
MySQL“从外到内”评估查询。也就是说,它首先获取外部表达式outer_expr 的值,然后运行子查询并捕获它产生的行。
采用JOIN
SELECT DISTINCT a.*
FROM Test a
INNER JOIN Test2 b
ON a.ID = b.ID
WHERE b.customer = 'Harry'
为了获得更快的性能,请确保ID
在两个表上都有KEY
。