У меня есть этот запрос в таблице с около 100 тыс. Записей, он работает довольно медленно (3-4 секунды), когда я вынимаю группу намного быстрее (меньше 0,5 с). Я совершенно в недоумении, что делать, чтобы исправить это:mysql "group by" очень медленный запрос
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
Любые идеи, как ускорить этот процесс, а возвращаясь в тот же результат (есть несколько сообщений в теме, я хочу вернуть только одно сообщение на поток в этом запросе).
благодарит заранее.
Как насчет индексов 'usertable'? Можете ли вы запустить «EXPLAIN» и опубликовать результаты? –
Frankie
Как правило, вам необходимо объявить все столбцы, упомянутые в SELECT, которые не инкапсулированы агрегатными функциями (COUNT, SUM, MIN, MAX и т. Д.) В GROUP BY. Будет ли «DISTINCT» служить вам лучше в этой ситуации? –
Почему левые присоединяются? Не будет ли каждое сообщение требовать получателя и отправителя? –