加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

一次Group By+Order By机能优化说明

发布时间:2019-03-21 13:49:04 所属栏目:编程 来源:周梦康
导读:最近通过一个日记表做排行的时辰发明出格卡,最后题目获得了办理,梳理一些索引和MySQL执行进程的履历,可是最后照旧有5个谜题没解开,但愿各人资助解答下 首要包括如下常识点 用数据措辞证明慢日记的扫描行数到底是怎样统计出来的 从 group by 执行道理找

题目与狐疑

  1. # SQL1  
  2. select aid,sum(pv) as num from article_rank where day>=20181220 and day<=20181224 group by aid order by num desc limit 10;  
  3. # SQL2  
  4. select aid,sum(pv) as num from article_rank force index(idx_aid_day_pv) where day>=20181220 and day<=20181224 group by aid order by num desc limit 10;  
  1. SQL1 执行进程中,行使的是全字段排序最后不必要回表为什么总扫描行数还要加上10才对得上?
  2. SQL1 与 SQL2 group by之后获得的行数都是552203,为什么会呈现 SQL1 内存不足,内里尚有哪些细节呢?
  3. trace 信息里的creating_tmp_table.tmp_table_info.row_limit_estimate都是838860;计较由来是姑且表的内存限定巨细16MB,而一行必要占的空间是20字节,那么最多只能容纳                             floor(16777216/20) = 838860行,而现实我们必要放入姑且表的行数是785102。为什么呢?
  4. SQL1 行使SQL_BIG_RESULT优化之后,原始表必要扫描的行数会乘以2,背后逻辑是什么呢?为什么仅仅是不再实行往内存姑且内外写入这一步会相差10多倍的机能?
  5. 通过源码看到 trace 信息内里许多扫描行数都不是现实的行数,既然是现实执行,为什么 trace 信息里不输出真实的扫描行数和容量等呢,好比                                                                                   filesort_priority_queue_optimization.rows_estimate在SQL1中的扫描行数我通过gdb看到计较法则如附录图 1
  6. 有没有器材可以或许统计 SQL 执行进程中的 I/O 次数? 

【编辑保举】

  1. 什么影响了数据库查询速率、什么影响了MySQL机能?
  2. MySQL运维拭魅战之PHP会见MySQL,你行使对了吗
  3. 记一次神奇的MySQL死锁排查
  4. 互联网公司口试必问的MySQL标题
  5. 开拓职员不得不知的MySQL索引和查询优化
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读