生活工程体验信仰哲学精神
投稿投诉
精神世界
探索历史
哲学文学
艺术价值
信仰创造
境界审美
体验技术
技能工具
工程信息
医学生产
生活运用
操作能力

记一次慢SQL优化

5月13日 火云谷投稿
  问题
  这是一个线上问题,从日志平台查询到的SQL执行情况,该SQL执行的时间为11。146s,可以认定为是一个慢查询,美化后的SQL如下:
  先找到这个表的定义以及索引情况如下:
  可见,主要有两个联合索引:status,toaccountid和status,fromaccountid问题分析
  我们先用explain查看执行计划:
  先看看explain的含义吧。
  id:没什么就是ID而已,如果没有子查询的话,通常就一行。
  selecttype:大致分为简单查询和复杂查询两类,复杂查询又分为简单子查询,派生表(from中的子查询)和union。一般我们看见simple比较多,代表不包含子查询和union,如果有复杂查询则会标记成primary。
  table:表名
  type:表示关联类型,决定Mysql通过什么方式查找行数据。这个一般就是我们看查询时候的关键信息点。比如ALL就是全表扫描;index代表使用索引;range代表有限制的扫描索引,回比直接扫描全部索引好一些;ref也是索引查找,会返回匹配具体某个值的行数据,这个还有一些其他类型,比如eqref只返回符合的一条记录,const会进行优化转换成常量。
  possiblekeys:显示可以使用的索引,但不一定用。
  key:实际使用到的索引。
  keylen:索引使用的字节数。
  ref:代表上面key一列中使用索引查找用到的列或者常量值。
  rows:为了找到符合条件的数据读取的行数。
  filtered:表示查询符合条件的数据占表的行数百分比,rowsfiltered可以大致得到关联的行数,Mysql5。1之后新增的字段。
  Extra:额外信息,比如usingindex表示使用覆盖索引,usingwhere表示在存储引擎之后进行过滤,usingtemporary表示使用临时表,usingfilesort表示对结果进行外部排序。
  基本上述的经验,我们看到索引和扫描行数其实都没啥问题,但是,我们发现执行计划中使用了usingfilesort。
  综合执行SQL和表定义,基本断定问题出在ORDERBYamountdesc,createtimeasc,在生产线上数据记录较多,使用orderby语句后引起filesort,导致出现了外部排序,从而降低了SQL的查询性能。
  再来理解一下orderby的工作原理,帮助我们更好的做SQL优化。
  一般情况下,执行计划中如果出现usingfilesort就会走如上的执行流程,对于Mysql来说,数据量小则在内存中进行排序,数据量大则需要在磁盘中排序,这个过程统一都叫做filesort。首先根据索引找到对应的数据,然后把数据放入排序缓冲区中如果要排序的数据实际大小没有超过缓冲区大小,就会使用内存排序,如快速排序,然后取出符合条件的数据返回如果超过了缓冲区大小,就需要使用外部排序,算法一般使用多路归并排序,首先对数据分块,然后对每块数据进行排序,排序结果保存在磁盘中,最后将排序结果合并
  除了知道排序的流程之外,排序使用的是字段的定义最大长度,而不是实际存储的长度,所以会花费更多的空间。
  另外在5。6之前的版本,如果涉及到多表关联查询,排序字段来自不同表的话,会将关联结果保存到临时表中,这就是我们平时看到usingfilesort的场景,如果这时候再使用limit,limit将会发生在排序之后,这样也可能导致排序的数据量非常大。
  整个情况来看,缓冲区大小、排序字段的数据长度、查询数据条数等都会影响查询性能。
  分析了整个排序过程,指导的优化思想就是尽量不使用usingfilesort,尤其是在排序的数据量比较大的时候,那么优化的方式就是尽量让查询出来的数据已经是排好序的,也就是合理使用联合索引以及覆盖索引。优化方向
  优化1:调整索引结构
  优化2:代码结构优化
  另外,我们发现一处代码,在for循环中做操作,然后更新DB表中的状态,这样会导致1500次的DB更新,可以考虑将DB的更新做批量处理,减少DB写的次数,比如100条记录执行一次DB更新,这样会大大降低写db的次数。
  这样每次方法调用,就会将3000次的写操作,降低为30次的写操作,当然批量的大小可以调节。
  这里我们仅仅针对SQL调优,代码问题就暂时不考虑了。性能结果
  测试环境数据量在30万数据优化前查询在1。5s以上优化后查询在0。4s左右
  查询性能提升3~4倍。
  从生产的从库上查询看到数据量大概有3KW,符合where条件的数据大概在300万左右优化前查询在11s~14s优化后查询在0。8s左右
  性能提升10倍以上。
  虽然这个优化比较简单,但是还是需要我们平时有扎实的基础才能选择最合理的方式进行优化。
投诉 评论 转载

记一次慢SQL优化问题这是一个线上问题,从日志平台查询到的SQL执行情况,该SQL执行的时间为11。146s,可以认定为是一个慢查询,美化后的SQL如下:先找到这个表的定义以及索引情……夏天跑步出汗,好处竟然这么多盛夏不期而至,我们也迎来了一年中最热的时期,阳光变得毒辣,气温逐渐升高,空气湿度增大,很多人还没开始跑步就已开始出汗,而在跑完后更是大汗淋漓,浑身湿透,像是刚洗完了澡一样,着实……爆红藏族男孩丁真,憔悴如中年大叔,热度渐退引起网友热议去年爆红的藏族男孩丁真,走红后陆续接了不少演艺活动,除了大型活动外也上了综艺节目,近日就有一张丁真参加公开活动的照片,才20岁的他和去年少年感爆棚的模样相去甚远,明显发福的模样……李云迪嫖娼,让娱乐这个圈露底裤了李云迪由朝阳群众举报嫖娼,这个瓜来的太突然,让一众喜欢他的粉丝瞠目结舌:原来黑白键如此不分黑白!原来系着领夹穿着燕尾服彬彬有礼的男神私底下如此肮脏!原来娱乐圈……许国利杀妻分尸背后的原因是什么?仅仅是为房产吗?内行看门道,外行看热闹。连日以来,杭州来女士失踪案经过媒体的不断发酵,引发了全社会的关注,成了家喻户晓的热门话题。人们在指责恶魔许国利不顾夫妻恩情,残忍地杀妻分尸的令人发……杭州保姆纵火案受害者重组家庭喜得爱女这两天网友们讨论得很多的话题就是四年前杭州纵火案的受害者林某在网上公布自己已经重组家庭,喜提爱女!当事人发文公布喜讯孩子张的很像爸爸看到这个新闻我首先是震惊,……奥运会男足半决赛前瞻西班牙难赢日本,巴西墨西哥言和今日下午,奥运会男足将展开两场半决赛的争夺。由墨西哥国奥对阵巴西国奥、东道主日本国奥对阵西班牙国奥。四支球队实力相当,谁晋级都不意外。日本和巴西的机会更大一些。墨西……直击赌王移灵东华义庄冷库暂存,何猷龙捧遗照,十人抬棺气势恢宏98岁赌王何鸿燊今年5月26日辞世,结束传奇一生。何家四房成员于本月10日为赌王在北角殡仪馆设灵,完成入殓仪式,灵柩暂存于殡仪馆。按照风水师建议,今早(17日)赌王灵柩移……周董一改常态,暖心与妈妈同框,超模既视感意外暴露婆媳关系提起周杰伦周董,那可是娱乐圈出了名的晒娃狂魔,在2019新春佳节到来之际,周杰伦一改往日作风,在个人社交平台INS晒出与妈妈叶惠美的暖心合影照,周杰伦不但在娱乐圈内是有名的音乐……瓦妮莎重拾灿烂笑容!怀抱义女吉安娜母爱爆棚,大呼熬过来了11月1日,瓦妮莎晒照并配文称:IloveyouElisabetGiannaGasol(我爱你伊丽莎白吉安娜加索尔后面还带上教女的标签。据悉瓦妮莎怀中抱着的小女孩是保罗加索尔的……又想白要腊肠,又想赊账,杨子在菜场遭围堵,一点不怕难堪杨子和黄圣依这对夫妻,遭受过太多的网络暴力,杨子之前有老婆有孩子,黄圣依的介入俨然成了小三,也因此被骂很多年,当时吃瓜群众都觉得圣依跟着他完全是为了钱和资源。直到这几年屡次上综……顶楼对奖杯的危险欲望,愤怒的河恩星对裴露娜实施暴力《顶楼2》的崔艺彬在楼梯上推了金贤洙。在青雅艺术节前夕,学爆加害者锡京(韩智贤饰)向姜玛丽(姜恩京饰)、刘珍妮(陈智熙饰)、吴允熙(柳真饰)和裴露娜(金贤洙饰)道歉,恳求……
伊能静50岁还在音乐节舞台上蹦跳唱摇滚?出道34年的她为了挣吉星高照杀青路透,翟潇闻表情呆滞玩手机,张凌赫凹造型太油腻宝宝第十二个月发育养育指标六神磊磊读金庸其实那片江湖并不遥远,就在你我身边董路认可李铁选人,面对不同对手灵活变换阵容尤为重要日日新星的尴尬澳大利亚何以超越印度,沦为强奸大国?父母才是孩子永不退休的班主任当年43岁的巩俐说自己不懂事加入新加坡国籍,现在想要改回来水浒传第二十八回读后感分享范冰冰微胖谁说的,看她和周迅章子怡走红毯,才发现冤枉了她身材54岁女神周海媚,崇尚不婚不生主义,活成了女人理想的样子我一造句用我一造句大全

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找