MySQL Subquery заставляет сервер зависать - PullRequest
1 голос
/ 26 июля 2010

Я пытаюсь выполнить следующий запрос

SELECT * FROM person 
         WHERE id IN 
             ( SELECT user_id FROM participation 
                    WHERE activity_id = '1' AND application_id = '1' 
             )

Внешний запрос возвращает около 4000 ответов, в то время как внутренний возвращает 29. При выполнении на моем веб-сервере ничего не происходило, и когда я проверял его локально, mysql завершалсяиспользуя 100% CPU и все еще ничего не достиг.Может ли размер быть причиной?

В частности, это приводит к зависанию сервера навсегда, я уверен, что веб-сервер, на котором я выполнял запрос, находится в процессе сбоя из-за этого (woops).

Ответы [ 2 ]

2 голосов
/ 26 июля 2010

почему вы не используете внутреннее соединение для этого запроса?Я думаю, что это будет быстрее (и легче читать) - и, возможно, это решит вашу проблему (но я не могу найти ошибку в вашем запросе).join-solution будет выглядеть так:

SELECT
  person.*
FROM
  person
INNER JOIN
  participation
ON
  person.id = participation.user_id
WHERE
  participation.activity_id = '1'
AND
  participation.application_id = '1'
1 голос
/ 26 июля 2010

Сколько строк в таблице participation и какие индексы?Здесь может помочь многостолбцовый индекс (user_id, activity_id, application_id).

Комментарии: IN не медленный.Подзапросы в IN могут быть медленными, если они связаны с внешним запросом.

...