[英]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
,速度快100倍。 help_mails
h WHERE closed=1 GROUP BY helper, grp; SELECT nick FROM accounts WHERE id IN (...)
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.