Tôi có truy vấn này trong một bảng với khoảng 100k bản ghi, nó chạy khá chậm (3-4s), khi tôi đưa ra nhóm nó nhanh hơn nhiều (ít hơn 0,5s). Tôi khá thua lỗ phải làm gì để khắc phục điều này:mysql "nhóm bởi" truy vấn rất chậm
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 có chỉ số về thread_id
, id
, senderid
và recipientid
.
giải thích lợi nhuận:
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
Bất kỳ ý tưởng làm thế nào để tăng tốc độ này lên khi trả lại kết quả tương tự (có nhiều tin nhắn mỗi chủ đề, tôi muốn quay trở lại chỉ có một thông điệp cho mỗi thread trong truy vấn này).
cảm ơn trước.
Còn các chỉ mục 'có thể sử dụng được thì sao? Bạn có thể chạy 'EXPLAIN' và đăng kết quả không? –
Frankie
Thông thường, bạn phải khai báo tất cả các cột được đề cập trong SELECT không được đóng gói bởi các hàm tổng hợp (COUNT, SUM, MIN, MAX, vv) trong GROUP BY. 'DISTINCT' có thể phục vụ bạn tốt hơn trong tình huống này không? –
Tại sao lại tham gia trái? Mỗi thư không yêu cầu người nhận và người gửi phải không? –