Mam to zapytanie w tabeli z około 100 tys. Rekordów, działa dość wolno (3-4s), kiedy wyjmuję grupę jest znacznie szybszy (mniej niż 0.5s). Jestem całkiem na straty, co zrobić, aby rozwiązać ten problem:mysql "group by" bardzo powolne zapytanie
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 ma indeksów thread_id
, id
, senderid
i recipientid
.
wyjaśnić Powroty:
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
Jakieś pomysły jak to przyspieszyć wracając ten sam wynik (istnieje wiele wiadomości w wątku, chcę wrócić tylko jedną wiadomość na wątek w tym zapytaniu).
z góry dzięki.
Co z indeksami 'usertable'? Czy możesz uruchomić 'EXPLAIN' i opublikować wyniki? –
Frankie
Zazwyczaj należy zadeklarować wszystkie kolumny wymienione w SELECT, które nie są enkapsulowane przez funkcje agregujące (COUNT, SUM, MIN, MAX, itd.) W GROUP BY. Czy "DISTINCT" lepiej Ci służy w tej sytuacji? –
Dlaczego lewy dołączyć? Czy każda wiadomość nie wymaga odbiorcy i nadawcy? –