0

G日,

我对以下内容感到有些困惑。当我运行此查询时,需要很长时间才能解决:

Select *
from test
where id in (select id from test2 where customer = 'HARRY');

当我自己运行子查询时,它很快就会解析为“13454”。当我将主查询的 where 语句更改为 in ('13454') 时,它也会立即解决。

有人知道为什么它不会以原始格式运行吗?

干杯,

雷内

4

2 回答 2

1

原因是 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 的值,然后运行子查询并捕获它产生的行。

于 2013-04-18T01:29:26.630 回答
0

采用JOIN

SELECT  DISTINCT a.*
FROM    Test a
        INNER JOIN Test2 b
            ON a.ID = b.ID
WHERE   b.customer = 'Harry'

为了获得更快的性能,请确保ID在两个表上都有KEY

于 2013-04-18T01:27:55.087 回答