MySQL查询与连接优化
问题描述:
我有一个查询: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
这是100倍的速度。help_mails
h WHERE closed = 1 GROUP BY helper,grp; (...)
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了索引。
答
请注意,您的第一个查询不同于第二个查询。
如果您有两个account
的NICK
,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)
上构建复合索引将对您有所帮助,因为它将用于GROUP BY
。
答
看起来有什么不对,help_mails.helper没有编入索引。
将索引添加到助手字段不会改善任何事情,我检查了它。 – Thinker 2009-06-04 12:56:10
这对我没有任何意义,但没关系。尝试关闭和助手上的复合键。 – chaos 2009-06-04 12:57:24