2017-05-25 8 views
0

私は、appname、uid、ratingの3つのカラムを持つテーブルを持っています。 各アプリ名の平均評価をすばやく取得する必要があります。これは私のコードです:平均でグループを一時的に使用することを避ける

SELECT 
    t1.appname as applicationName, 
    Avg(t1.rating) as averageRating 
FROM 
    `user_ratings` t1 
GRO 
    t1.appname 

問題は、これは数秒かかり、および/ tmpがいっぱいになる(私はこれについて何もできない、私はまた「できればしても失敗する可能性があります私の埋め込まれたサーバー上にあり、 t my.cfgを編集します)。だから、私は一時的なものを使わずにこれをしたい。ここで

が期待通りにTMPが使用されていることを示す、EXPLAINの出力です:

1 SIMPLE t1 ALL 6399 Using temporary; Using filesort

平均がなければ、クエリは瞬時に完了し、これはEXPLAIN生成:

1 SIMPLE t1 index appname 452 6399 Using index

答えて

1
INDEX(appname, rating) 

これはGROUP BYに最適であり、それは「覆っていない」され別々のBTree)。

パーティショニングはではなく、ヘルプです。

+0

完璧に動作します、ありがとう。私は索引をカバーすることについて読まなければならない。 – Klocman

+0

私のクイックディスカッション:http://mysql.rjweb.org/doc.php/index1さらに長い "cookbook":http://mysql.rjweb.org/doc.php/index_cookbook_mysql –

0

クエリの「重い」部分はGROUP BYです。

appnameをプライマリインデックスとして設定するか、このフィールドでパーティションを設定してください。である(つまり、クエリに必要なすべてのデータがインデックスにある、「データ」に到達する必要が -

+0

Appnameには重複があり、プライマリにすることはできません。パーティションプラグイン(旧バージョンのMySQL)はありません。 – Klocman

関連する問題