Соединение слева с group_concat слишком медленное - PullRequest
2 голосов
/ 14 сентября 2011

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

users (id, firstname, lastname, etc)
users_to_groups (user_id(index), group_id(index))

Я хотел бы сделать запрос, который возвращает записи, подобные следующим:

firstname   lastname    groups
John        Smith       1,2,3,5
Tom         Doe         3,5

Я использую функцию GROUP_CONCAT, и в настоящее время мой запросis:

SELECT * FROM users
LEFT OUTER JOIN 
(
     SELECT user_id, group_concat(group_id) FROM users_to_groups GROUP BY user_id
) AS i
ON users.id = i.user_id

Работает, но очень медленно.У меня 40 тыс. Пользователей и 260 тыс. Записей в таблице групп.Похоже, что запрос не использует индекс и проходит все 260 тыс. Строк для каждого пользователя.

Есть ли способ сделать это быстрее?Это займет 3 с лишним минуты, но я думаю, что не должно.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 14 сентября 2011

попробовать:

SELECT
    u.user_id, u.firstname, u.lastname, group_concat(g.group_id)
    FROM users                           u
        LEFT OUTER JOIN users_to_groups  g ON u.id on g.user_id
    GROUP BY u.id, u.firstname, u.lastname
4 голосов
/ 14 сентября 2011

Это не левое соединение, а дополнительный выбор, который замедляет ваш запрос. MySQL действительно отстой, когда дело доходит до суб-выбора.

Это, вероятно, быстрее:

SELECT 
  u.id, u.firstname, u.lastname,
  group_concat(ug.group_id) AS groups
FROM
  users u
  LEFT JOIN users_to_groups ug ON ug.user_id = u.id
GROUP BY 
   u.id, u.firstname, u.lastname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...