5

我在一个大约有 10 万条记录的表中有这个查询,它运行速度很慢(3-4 秒),当我取出组时它要快得多(不到 0.5 秒)。我很茫然如何解决这个问题:

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_ididsenderid上有索引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

任何想法如何在返回相同结果的同时加快速度(每个线程有多条消息,我想在此查询中每个线程只返回一条消息)。

提前致谢。

4

2 回答 2

1

尝试这个:

select m.thread_id, m.id, m.senderid, m.recipientid, 
       f.username as from_name, t.username as to_name
from msgtable m
join usertable f on m.senderid = f.id
join usertable t on m.recipientid = t.id
where m.id = (select MAX(id) from msgtable where thread_id = m.thread_id)

或这个:

select m.thread_id, m.id, m.senderid, m.recipientid, 
       (select username from usertable where id = m.senderid) as from_name,
       (select username from usertable where id = m.recipientid) as to_name
from msgtable m
where m.id = (select MAX(id) from msgtable where thread_id = m.thread_id)

为什么用户表保持连接?消息可以缺少来自或到吗?...

于 2010-10-26T16:28:57.787 回答
0

最大的问题是您没有可用的索引msgtable至少在 senderid和上创建一个索引recipientid,它应该有助于提高查询速度,因为它会限制需要扫描的结果数量。

于 2010-10-26T17:11:40.737 回答