Оптимизация группы подзапросом в Mysql - PullRequest
8 голосов
/ 01 апреля 2012

Это довольно простой запрос.

Если я выполняю запросы отдельно, это не так медленно, но когда я объединяю их, это очень медленно.

Я не уверен, как это оптимизировать. Я просто хочу показать несколько возвратов. Итак, где 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 ]

2 голосов
/ 01 апреля 2012

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 голос
/ 01 апреля 2012

Полагаю, это скорее относится к переписыванию, чем к оптимизации, но я все равно попробую:

SELECT 
  r.* 
FROM faultrefunds_v2 r
WHERE EXISTS (
  SELECT *
  FROM faultrefunds_v2 r1 
  WHERE r1.faultid = r.faultid
    AND r1.id <> r.id
);
1 голос
/ 01 апреля 2012

Я думаю, что ваш запрос не отвечает на вопрос.Насколько я понимаю, вы должны сначала получить все faultid, которые имеют более одного связанного идентификатора (строка в таблице).А затем получите все эти строки (не только идентификатор ошибки).

Попробуйте:

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