在Mysql中通过子查询优化组

时间:2012-04-01 15:45:53

标签: mysql performance group-by subquery

这是一个非常简单的查询。

如果我单独运行查询它并不慢,但是当我将它们组合起来时它非常慢。

我不确定如何优化它。我基本上只想要多次退款。所以faultid不止一次存在。

SELECT 
    r.* 
FROM 
    faultrefunds_v2 r
WHERE 
    r.id IN (SELECT r1.id 
             FROM faultrefunds_v2 r1 
             GROUP BY faultid
             HAVING count(r1.faultid) > 1);

解释的结果已作为图像附加

enter image description here

3 个答案:

答案 0 :(得分:2)

IN子句使用它的方式会非常慢,请改用JOIN

SELECT r.* FROM ( 
  SELECT r1.id AS id
  FROM faultrefunds_v2 r1 
  GROUP BY faultid
  HAVING count(r1.faultid) > 1
) AS ids
LEFT JOIN faultrefunds_v2 AS r
ON( ids.id = r.id )

答案 1 :(得分:1)

我认为你的查询没有回答这个问题。据我所知,你应该首先获得具有多个关联id的所有faultid(表中的行)。然后获取所有这些行(不仅仅是faultId)。

试试这个:

select * from faultrefunds_v2
where faultId in (
    select faultId from faultrefunds_v2
    group by faultId
    having count(*) > 1
)

答案 2 :(得分:1)

我想,这有点像重写而不是优化,但无论如何我会尝试这样做:

SELECT 
  r.* 
FROM faultrefunds_v2 r
WHERE EXISTS (
  SELECT *
  FROM faultrefunds_v2 r1 
  WHERE r1.faultid = r.faultid
    AND r1.id <> r.id
);