繁体   English   中英

具有联接优化的MySQL查询

[英]MySQL query with join 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 (...) 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

account.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建立索引是有问题的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM