2

次のSQLステートメントを使用しています。

SELECT
  SUM(t.Points) AS `Points`,
  CONCAT(s.Firstname, " ", s.Surname) AS `Name`
FROM transactions t
INNER JOIN student s
  ON t.Recipient_ID = s.Frog_ID
GROUP BY t.Recipient_ID

クエリの実行には21秒かかります。奇妙なことに、私が実行するLIMIT 0, 30のにまだ20.7秒かかるとしても!

このステートメントでonを実行するEXPLAINと、結果は次のようになります。

id  select_type table   type    possible_keys   key     key_len     ref     rows        Extra
1   SIMPLE      s       ALL     PRIMARY         NULL    NULL        NULL    877         Using temporary; Using filesort
1   SIMPLE      t       ALL     NULL            NULL    NULL        NULL    135140      Using where

トランザクションは次の形式を取ります。

Transaction_ID  Datetime    Giver_ID    Recipient_ID    Points  Category_ID     Reason
1               2011-09-07  36754       34401           5       6               Gave excellent feedback on the new student noteboo...

テーブルには130,000行ありtransactionsます。


学生は次の形式を取ります。

Frog_ID UPN             Firstname   Surname     Intake_Year
101234  K929221234567   Madeup      Student     2010

テーブルには835行ありstudentます。


インデックス

トランザクションインデックス

学生インデックス


このクエリをより効率的にする方法はありますか?

4

1 に答える 1

2

あなたは両方ともそれを使って参加しRecepient_ID、それによってグループ化しますが、それは索引付けされていないので、これが問題であると思います。

transactions.Recepient_IDインデックスとして追加してみてください。

于 2013-01-23T12:28:01.137 に答える