Можно ли оптимизировать левое соединение в запросе MySQL «привилегированных пользователей»? - PullRequest
1 голос
/ 27 февраля 2012

У меня есть две таблицы:

poll_response (poll_id, option_id, user_id) (около 500 000 строк, с 500 уникальными опросами, 1000 уникальных опций и 25000 уникальных пользователей)

предпочитаемые_пользователи (user_id) (около 800 строк)

Я бы хотел определить, какой процент пользователей, которые выбирают каждыйопцией являются «привилегированные пользователи» (т.е. те, которые имеют высокую репутацию).Другие пользователи могут ответить на опрос;чтобы определить, что ответ пришел от предпочтительного пользователя, требуется соединение с таблицей Предпочитаемое_пользователя.

Вот что я получил:

SELECT option_id, count(*) AS all_votes, count(preferred_users.user_id) AS preferred_votes
FROM response
LEFT JOIN preferred_users ON response.user_id = preferred_users.user_id
GROUP BY option_id

Запрос выплевывает таблицунапример:

| option_id | all_votes | preferred_votes
| 1         | 500       | 150
| 2         | 550       | 250
| 3         | 525       | 300

Затем я могу выполнить математические расчеты, чтобы определить процент.

Проблема в том, что запрос часто прерывается - это значит, что для его завершения требуется более минуты.

Есть ли способ избавиться от левого соединения или иным образом оптимизировать запрос?

1 Ответ

1 голос
/ 28 февраля 2012

пробовали ли вы разделить его на два запроса - один для общего количества и один для предпочитаемых пользователей?я подозреваю, что то, что заставляет его работать медленно, проходит через записи в группе, считая ненулевые записи (но вы можете увидеть себя, используя объяснение).

другими словами:

select option_id, count(*) from response group by option_id
select option_id, count(*) from response, preferred_users where response.user_id = preferred_user.id group by option_id

вы можете даже присоединиться к ним:

select * from 
  (select option_id, count(*) as total from response group by option_id
   left join
   select option_id, count(*) as preferred from response, preferred_users where response.user_id = preferred_user.id group by option_id
   using (option_id))

(не уверен, что у меня есть синтаксис прямо здесь, но вы поняли).

также у вас есть индекс наСтолбец предпочитаемый_пользователь.ид тоже, верно?и отношение внешнего ключа от одного к другому?если нет, попробуйте сначала.

...