避免在Avg中使用临时组

时间:2017-05-25 13:51:15

标签: mysql sql query-optimization

我有一个包含三列的表 - appname,uid,rating。 我需要快速获得每个appname的平均评分。这是我的代码:

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

问题是,在我的嵌入式服务器上这需要几秒钟,如果/ tmp填满,甚至可能会失败(我无法对此做任何事情,我也无法编辑my.cfg )。因此,我想在不使用临时的情况下这样做。

这是EXPLAIN的输出,显示tmp按预期使用:

1 SIMPLE t1 ALL 6399 Using temporary; Using filesort

如果没有Avg,查询会立即完成,并生成此EXPLAIN:

1 SIMPLE t1 index appname 452 6399 Using index

2 个答案:

答案 0 :(得分:2)

INDEX(appname, rating)

这是GROUP BY的最佳选择,它是“覆盖” - 也就是说,查询所需的所有数据都在索引中,无需进入“数据”(这是一个分开BTree)。

分区帮助。

答案 1 :(得分:0)

"重"您的查询的一部分是 GROUP BY

尝试将 appname 设置为主索引,或按此字段进行分区。