Ich habe diese Abfrage in einer Tabelle mit etwa 100k Datensätze, es läuft ziemlich langsam (3-4 s), wenn ich die Gruppe herausnehmen ist es viel schneller (weniger als 0,5 s). Ich bin ganz bei Verlust, was dies zu tun zu beheben:mysql "Gruppe von" sehr langsame Abfrage
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 hat Indizes auf thread_id
, id
, senderid
und recipientid
.
kehrt erklären:
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
Irgendwelche Ideen, wie dies zu beschleunigen, während das gleiche Ergebnis zurückkehrt (es gibt mehrere Nachrichten pro Thread, ich will in dieser Abfrage pro Thread nur eine Nachricht zurück).
Dank im Voraus.
Was ist mit 'usertable' Indizes? Können Sie bitte 'EXPLAIN' ausführen und die Ergebnisse veröffentlichen? –
Frankie
In der Regel müssen Sie alle in SELECT erwähnten Spalten deklarieren, die nicht durch Aggregatfunktionen (COUNT, SUM, MIN, MAX usw.) in GROUP BY gekapselt sind. Würde 'DISTINCT' Ihnen in dieser Situation besser dienen? –
Warum die linke beitreten? Würde nicht jede Nachricht einen Empfänger und einen Absender erfordern? –