Ho questa query in una tabella con circa 100k di record, viene eseguito piuttosto lento (3-4s), quando estrapolo il gruppo è molto più veloce (meno di 0,5 s). Sono abbastanza a perdita di cosa fare per risolvere questo problema:mysql "group by" query molto lenta
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 ha indici sulle thread_id
, id
, senderid
e recipientid
.
spiegano i rendimenti:
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
Delle idee come accelerare l'operazione mentre tornava lo stesso risultato (ci sono più messaggi per discussione, voglio tornare solo messaggio per thread in questa query).
grazie in anticipo.
E gli indici 'usertable'? Puoi eseguire "SPIEGA" e pubblicare i risultati? –
Frankie
In genere, è necessario dichiarare tutte le colonne menzionate in SELECT che non sono incapsulate da funzioni di aggregazione (COUNT, SUM, MIN, MAX, ecc.) In GROUP BY. 'DISTINCT' ti servirebbe meglio in questa situazione? –
Perché la sinistra si unisce? Ogni messaggio non richiederebbe un destinatario e un mittente? –