2009-06-04 79 views
2

我有一个查询:MySQL查询与连接优化

SELECT a.nick,grp,count(*) FROM help_mails^h JOIN占一个ON h.helper = a.id WHERE关闭= 1 GROUP BY帮手,GRP,a.nick

是什么此连接错误? 当我做了2个查询:

SELECT helper,grp,count(*) FROM help_mails h WHERE closed = 1 GROUP BY helper,grp; (...) 这是100倍的速度。

EXPLAIN返回此:

id  select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE h ref  closed closed 1 const 1846 Using temporary; Using filesort 
1 SIMPLE a ref  PRIMARY  PRIMARY  4 margonem.h.helper 1 Using where; Using index

accounts.id,help_mails.grp和help_mails.closed了索引。

回答

5

请注意,您的第一个查询不同于第二个查询。

如果您有两个accountNICKCOUNT(*)的这些帐户将在第一个查询中合并在一起并在第二个单独返回。

如果你想单独COUNT的单独account的总是被退回,可以将您的查询组合成一个:

SELECT a.nick, gpr, cnt 
FROM (
     SELECT helper, grp, COUNT(*) AS cnt 
     FROM help_mails h 
     WHERE closed = 1 
     GROUP BY 
       helper, grp 
     ) ho 
JOIN accounts a 
ON  a.id = ho.helper 

或更改GROUP BY条件的第一个查询:

SELECT a.nick, grp, count(*) 
FROM help_mails h 
JOIN accounts a 
ON  h.helper = a.id 
WHERE closed = 1 
GROUP BY 
     helper, grp, a.id, a.nick 

help_mails (closed, helper, grp)上构建复合索引将对您有所帮助,因为它将用于GROUP BY

1

看起来有什么不对,help_mails.helper没有编入索引。

+0

将索引添加到助手字段不会改善任何事情,我检查了它。 – Thinker 2009-06-04 12:56:10

+0

这对我没有任何意义,但没关系。尝试关闭和助手上的复合键。 – chaos 2009-06-04 12:57:24