Быстро выбрать все строки с «1 или более» совпадающих строк в другой таблице - PullRequest
1 голос
/ 26 мая 2009

Я бы хотел выбрать все строки из одной таблицы, которые соответствуют «одной или нескольким» строкам в другой таблице, наиболее эффективным способом.

SELECT identity.id FROM identity
INNER JOIN task ON
  task.identityid=identity.id
  AND task.groupid IN (78, 122, 345, 12, 234, 778, 233, 123, 33)

В настоящее время, если есть несколько совпадающих задач, это возвращает один и тот же идентификатор несколько раз (но снижение производительности при их последующем устранении не так уж плохо). Я бы хотел, чтобы вместо этого я возвращал только одну строку для каждого удостоверения, которая соответствует одной или нескольким из этих групп задач, и мне было интересно, есть ли более эффективный способ, чем сделать DISTINCT или GROUP BY.

Проблема с выполнением DISTINCT или GROUP BY состоит в том, что таблица задач по-прежнему сканируется на предмет всех совпадений groupid, а затем они уменьшаются до одного посредством временной таблицы (иногда с сортировкой файлов). Я бы предпочел, чтобы он выполнял какую-то оценку короткого замыкания - не преследуйте далее любые последующие совпадения задач для того же идентификатора после того, как он его нашел.

Я думал о выполнении подзапроса EXISTS, но я не знаю, как они оптимизированы. Мне нужно, чтобы он сначала присоединился к таблице задач, а не к таблице идентификаторов, поэтому я не выполняю полное сканирование таблицы идентификаторов, которая очень велика и будет содержать множество несоответствий.

Ответы [ 3 ]

1 голос
/ 26 мая 2009

Просто использование «SELECT DISTINCT» с тем, что у вас есть, должно быть эффективным в MySQL. Возможно, вам придется поместить ваши значения в таблицу и присоединиться к ней, а не использовать «IN (...)».

0 голосов
/ 26 мая 2009

Exists должен работать очень хорошо для вас, пока индексируемый вами столбец в подзапросе проиндексирован.

Я ожидал бы, что существует лучше, чем объединение и группировка, но я должен был бы попробовать это, чтобы быть уверенным. Я столкнулся с достаточным количеством проблем с производительностью в MySQL, где мой прогноз был неверным, чтобы знать, что стоит попробовать.

0 голосов
/ 26 мая 2009

Поддерживает ли MYSQL синтаксис TOP N? Если так:

SELECT TOP 1 identity.id FROM identity
INNER JOIN task ON
  task.identityid=identity.id
  AND task.groupid IN (78, 122, 345, 12, 234, 778, 233, 123, 33)
...