在mysql中有没有快速查询平均值的方法
下表名称为:球队得分在mysql中有没有快速查询平均值的方法,mysql,performance,Mysql,Performance,下表名称为:球队得分 ---------------------------- Team score date ---------------------------- A 1 2017-07-01 B 2 2017-07-02 A 3 2017-07-02 B 4 2017-07-01 C 5 2017-07-02 C 6 2017-07-
----------------------------
Team score date
----------------------------
A 1 2017-07-01
B 2 2017-07-02
A 3 2017-07-02
B 4 2017-07-01
C 5 2017-07-02
C 6 2017-07-01
去拿这张桌子
-------------------------------------
team avg avg_excluding_itself
-------------------------------------
A 2.0 4.25
B 3.0 3.75
C 5.5 2.50
最有效的方法是什么
下面的查询将无法工作,因为它太消耗资源。该表的大小为100GB
select a.team, avg(a.score) as avg, avg(b.score) as avg_excluding_itself
from team_score a join team_score b on a.team <> b.team group by a.team
选择a.team,平均得分(a.score)作为平均得分,平均得分(b.score)作为平均得分,不包括自身
从a队得分a队加入a队得分b队b队a队
两个原则:
- 平均值是总和除以计数
- “排除”可以通过计算整个总数减去要排除的部分来计算
SELECT
team,
ROUND(sum_me / count_me, 1) AS "Team's avg",
ROUND((sum_all - sum_me) / (count_all - count_me), 2) AS "Avg of others"
FROM ( SELECT team,
SUM(score) AS sum_me,
COUNT(*) AS count_me
FROM team_score
GROUP BY team ) AS me
JOIN ( SELECT SUM(score) AS sum_all,
COUNT(*) AS count_all
FROM team_score ) AS x -- only one row
GROUP BY team;
将有两个表扫描,每个子查询一个;这样做效率太低。您是如何得出这样的结论的:这将消耗资源。是否共享结果,并尝试对查询执行
解释
,以帮助确定资源消耗的任何问题。100GB?你有世界各地所有小联盟比赛的分数吗?