具有连接优化的MySQL查询

时间:2009-06-04 12:49:25

标签: mysql query-optimization

我得到了一个问题:

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.nick

这次加入有什么问题? 当我提出2个问题时:

help_mails 它快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得到索引。

2 个答案:

答案 0 :(得分:5)

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

如果两个NICK的{​​{1}}相同,则这些帐户的account将在第一个查询中合并在一起,并在第二个查询中单独返回。

如果您希望始终返回单独COUNT(*)的单独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)中使用。

答案 1 :(得分:1)

看起来错误的是help_mails.helper没有编入索引。