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倍高速です。

EXPLAINはこれを返します:

idselect_typeテーブルタイプpossible_keyskeykey_len ref rows Extra
1 SIMPLE h ref close close 1const1846一時的なものを使用します。filesortの使用
1 SIMPLE a ref PRIMARY PRIMARY 4 margonem.h.helper1whereを使用します。インデックスの使用

account.id、help_mails.grp、help_mails.closedがインデックスを取得しました。

4

2 に答える 2

5

最初のクエリは2番目のクエリと同じではないことに注意してください。

NICK2つaccountの'が同じである場合COUNT(*)、これらのアカウントの'は最初のクエリでマージされ、2番目のクエリで別々に返されます。

個別COUNTの'accountを常に返すようにしたい場合は、クエリを1つにまとめることができます。

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 に答える