在窗口函数中使用平均值和首先计算平均值和使用连接之间的性能有差异吗

zf2sa74q  于 2022-10-22  发布在  Mysql
关注(0)|答案(1)|浏览(141)

我正在使用MySQL 8.0 Table NameL:sc(score)
列:student_id、course_id、score
一些虚拟数据:

  1. create table sc(SId varchar(10),CId varchar(10),score decimal(18,1));
  2. insert into sc values('01' , '01' , 80);
  3. insert into sc values('01' , '02' , 90);
  4. insert into sc values('01' , '03' , 99);
  5. insert into sc values('02' , '01' , 70);
  6. insert into sc values('02' , '02' , 60);
  7. insert into sc values('02' , '03' , 80);
  8. insert into sc values('03' , '01' , 80);
  9. insert into sc values('03' , '02' , 80);
  10. insert into sc values('03' , '03' , 80);
  11. insert into sc values('04' , '01' , 50);
  12. insert into sc values('04' , '02' , 30);
  13. insert into sc values('04' , '03' , 20);
  14. insert into sc values('05' , '01' , 76);
  15. insert into sc values('05' , '02' , 87);
  16. insert into sc values('06' , '01' , 31);
  17. insert into sc values('06' , '03' , 34);
  18. insert into sc values('07' , '02' , 89);
  19. insert into sc values('07' , '03' , 98);

问题是:输出所有分数和每个学生的平均分数,并按平均分数的降序排列结果
我想出了两个解决方案:

  1. -- Solution 1
  2. SELECT
  3. sc.*,
  4. AVG(score) OVER (PARTITION BY sid) AS avg_score
  5. FROM sc
  6. ORDER BY avg_score DESC
  1. -- Solution 2
  2. select * from sc
  3. left join (
  4. select sid,avg(score) as avscore from sc
  5. group by sid
  6. )r
  7. on sc.sid = r.sid
  8. order by avscore desc;

但是,如果表真的很大,这两种解决方案的效率性能是否存在差异?

非常感谢。

k2arahey

k2arahey1#

如果将此项添加到表中,则解决方案2可能会发光:

  1. INDEX(sid, score)

我用你的数据和查询做了一个小测试,但结果不确定。(我检查了会话状态“Handler%”值。)
我更喜欢这个2:
选择*FROM(按sid从sc组中选择sid,avg(score)作为avscore)as r按avscore desc加入sc USING(sid)顺序;
建议你尝试一百万行。

相关问题