SQL语句无限运行

时间:2013-03-26 13:23:52

标签: mysql sql

此语句运行很长时间并且不返回任何内容。我做错了什么?

SELECT *
  FROM supplierdata AS s1
 WHERE s1.zip IN (
    SELECT zip
      FROM supplierdata AS s2
     WHERE s1.zip = s2.zip
           );

3 个答案:

答案 0 :(得分:4)

你的陈述只是长时间运行,因为效率很低。

但首先,查询并没有多大意义。以下内容相同:

select *
from supplierdata
where zip is not null

我建议您终止查询并在supplierdata(zip)上构建索引。这应该会大大提高查询的性能。

实质上,您的查询正在为supplierdata的每一行运行子查询。这非常昂贵,需要对表进行全表扫描。索引应该解决这个问题。

答案 1 :(得分:1)

你的人数很差,所以你的查询基本上是:

  1. for supplierdata中的每一行
  2. 查询整个supplierdata以查找当前行zip
  3. 如果我找到了一些选择它
  4. 重复。

  5. 实现相同目标的更简单方法。     选择         算(1)     从         supplierdata s1     哪里         zip不为空

答案 2 :(得分:1)

除了“这没有任何意义”之外:

select * 
from supplierdata as s1 
where s1.zip IN 
(select zip from supplierdata as s2 where s2.zip between 200 and 300);

等同于

select * 
from supplierdata as s1 
where s1.zip 
between 200 and 300;

依此类推......只是没有任何意义......如果你解释一下你想要完成的事情应该会更好;)

或者不引用父查询的任何条件;你循环不是无限的,只是很长,因为它首先逐行,就像@Nix说的那样