具有连接优化的MySQL查询

Thi*_*ker 2 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个查询时:

SELECT helper,grp,count(*) FROM help_mails h WHERE closed=1 GROUP BY helper, grp; SELECT nick FROM accounts WHERE id IN (...) 它快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得到了索引.

Qua*_*noi 5

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

如果您NICK对两个帐户有相同account的权限,则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
Run Code Online (Sandbox Code Playgroud)

或更改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
Run Code Online (Sandbox Code Playgroud)

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