2

我有一个查询:

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 个查询时:

SELECT helper,grp,count(*) FROM help_mails h WHERE closed=1 GROUP BY helper, grp; SELECT nick FROM accounts WHERE id IN (...) 它快 100 倍。

解释返回这个:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE h ref 关闭关闭 1 const 1846 使用临时;使用文件排序
1 SIMPLE a ref PRIMARY PRIMARY 4 margonem.h.helper 1 使用 where;使用索引

accounts.id、help_mails.grp 和 help_mails.closed 获得了索引。

4

2 回答 2

5

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

如果NICK两个account's 相同,COUNT(*)则这些帐户的 's 将在第一个查询中合并在一起,并在第二个查询中单独返回。

如果您希望始终返回单独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.

于 2009-06-04T12:53:56.527 回答
1

看起来问题是 help_mails.helper 没有被索引。

于 2009-06-04T12:51:35.377 回答