2009-06-04 26 views
2

私は、クエリを持って参加しますこの結合に間違っていますか? 2つのクエリを作成したとき:MySQLのクエリの最適化

SELECT helper,grp,count(*) FROM help_mails h WHERE close = 1 GROUP BY helper、grp; SELECTニックFROMアカウントWHERE id IN(...) 100倍高速です。

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:

は、このリターンを説明します。

答えて

5

最初のクエリは2番目のクエリと同じではありません。

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

あなたが常に返されるの別々のCOUNT「は独立しaccountのためのs」をする必要がある場合は、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で使用されるので、多くのお手伝いをします。

+0

ありがとうございます:)内部の選択を持つ最初のクエリは、それがすべきであるように速く動作します:) – Thinker

+0

思考:コンポジットインデックスを作成するとさらに速く動作します:) – Quassnoi

1

help_mails.helperがインデックスに登録されていないことが間違っているようです。

+0

ヘルパーフィールドにインデックスを追加しても何も改善されない、私はそれをチェックした。 – Thinker

+0

それは私には分かりませんが、大丈夫です。閉じたヘルパーで複合キーを試してみてください。 – chaos