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
它快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
accounts.id,help_mails.grp和help_mails.closed得到了索引.
请注意,您的第一个查询与第二个查询不同.
如果您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.