mysql "group by" очень медленный запрос - PullRequest
5 голосов
/ 26 октября 2010

У меня есть этот запрос в таблице, содержащей около 100 тыс. Записей, он выполняется довольно медленно (3-4 с), когда я убираю группу, он намного быстрее (менее 0,5 с). Я в недоумении, что делать, чтобы это исправить:

SELECT msg.id,
       msg.thread_id,
       msg.senderid,
       msg.recipientid, 
       from_user.username AS from_name,
       to_user.username AS to_name
FROM msgtable AS msg
LEFT JOIN usertable AS from_user ON msg.senderid = from_user.id
LEFT JOIN usertabe AS to_user ON msg.recipientid = to_user.id
GROUP BY msg.thread_id
ORDER BY msg.id desc

msgtable имеет индексы thread_id, id, senderid и recipientid.

Объясните возврат:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  msg ALL NULL    NULL    NULL    NULL    162346  Using temporary; Using filesort
1   SIMPLE  from_user   eq_ref  PRIMARY PRIMARY 4   db.msg.senderid 1    
1   SIMPLE  to_user eq_ref  PRIMARY PRIMARY 4   db.msg.recipientid  1

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

заранее спасибо.

Ответы [ 2 ]

1 голос
/ 26 октября 2010

попробуйте это:

select m.thread_id, m.id, m.senderid, m.recipientid, 
       f.username as from_name, t.username as to_name
from msgtable m
join usertable f on m.senderid = f.id
join usertable t on m.recipientid = t.id
where m.id = (select MAX(id) from msgtable where thread_id = m.thread_id)

Или это:

select m.thread_id, m.id, m.senderid, m.recipientid, 
       (select username from usertable where id = m.senderid) as from_name,
       (select username from usertable where id = m.recipientid) as to_name
from msgtable m
where m.id = (select MAX(id) from msgtable where thread_id = m.thread_id)

Почему пользовательские таблицы остались объединенными? Сообщение может отсутствовать от или до? ..

0 голосов
/ 26 октября 2010

Самая большая проблема в том, что у вас нет используемых индексов на msgtable.Создайте индекс для как минимум senderid и recipientid, и это должно помочь скорости вашего запроса, так как ограничит количество результатов, которые необходимо сканировать.

...