MYSQL子查询性能不一致

时间:2013-04-18 01:26:33

标签: mysql subquery

G-天,

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

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

当我自己运行子查询时,它会在spit second中解析为'13454'。 当我将主要查询的where语句更改为('13454')时,它也会立即解析。

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

干杯,

2 个答案:

答案 0 :(得分: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中已修复)。较早的documentation将其解释为:

  

考虑以下子查询比较:

     

outer_expr IN(SELECT inner_expr FROM ... WHERE subquery_where)

     

的MySQL   从外到内评估查询。也就是说,它首先获得   外部表达式outer_expr的值,然后运行   子查询并捕获它产生的行。

答案 1 :(得分:0)

使用JOIN

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

为了提高性能,请确保两个表上的ID都有KEY