2010-10-26 186 views
5

我在一个有大约100k记录的表中有这个查询,它运行速度很慢(3-4s),当我取出这个组时速度更快(小于0.5s)。我很为亏损怎样做才能解决这个问题:mysql“group by”非常缓慢的查询

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_ididsenderidrecipientid指标。

解释回报:

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 

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

在此先感谢。

+1

'usertable'索引怎么样?你可以运行'EXPLAIN '并发布结果吗? – Frankie 2010-10-26 16:25:21

+1

通常,您必须在GROUP BY中声明SE​​LECT中提到的所有未被聚合函数(COUNT,SUM,MIN,MAX等)封装的列。在这种情况下'DISTINCT'能更好地为您服务? – 2010-10-26 16:26:16

+0

为什么左连接?每封邮件都不需要收件人和发件人吗? – 2010-10-26 16:29:43

回答

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) 

为什么用户表左加入?是否可以丢失一条消息?

+0

非常感谢,我尝试了两种选择 - 第一个选项约1.5s,第二个选项约2s。还有什么我可以做得更多? – 2010-10-26 16:56:07

+0

@Sherif好吧,你真的需要所有的线程吗?...是否有一个日期时间列可以用来减少所需的数据? – Fosco 2010-10-26 16:59:23

+0

@Forsco,实际上这个查询被翻译成是一个分页类的查询选择计数(*) - 是的,我需要所有的线程,因为这是一个管理员功能... – 2010-10-26 17:17:52

0

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

+0

我确实有索引,上面的更新问题。 – 2010-10-26 17:17:04