MySQLlimit导致的执行计划差异
这是学习笔记的第2271篇文章
今天收到一个业务的报警,提示慢日志比较频繁,登上环境查看,发现SQL是一条看起来很简单的语句,环境在MySQL5。7。16版本下,慢日志里面执行时间显示是近1分钟,我在从库上面执行了一下,发现优化空间确实很大:selectOrgIdfromtestcomm。applyjoinorgwhereIfDelandApplyStatusandUserId12345678ORDERBYCreateTimedescLIMIT;Emptyset(48。71sec)
执行计划如下:explainselectOrgIdfromtestcomm。applyjoinorgwhereIfDelandApplyStatusandUserId12345678ORDERBYCreateTimedescLIMITG1。rowid:selecttype:SIMPLEtable:applyjoinorgpartitions:type:indexpossiblekeys:IndexRTUserkey:IndexCreateTimekeylen:5ref:rows:4332filtered:0。00Extra:Usingwhererowinset,warning(0。00sec)
到了这个时候,不上表结构有些草率了,结构有所删减。CREATETABLEapplyjoinorg(ApplyJoinIdint(11)NOTAUTOINCREMENT,RTIdint(11)DEFAULT,UserIdint(11)NOT,OrgIdint(11)NOT,ApplyMsgvarchar(100)DEFAULT,CreateTimedatetimeNOT,ReplyMemIdint(11)DEFAULT0,ReplyTimedatetimeNOT,ApplyStatustinyintDEFAULT1COMMENT0拒绝1申请2同意,IfDeltinyintDEFAULT1,UpdateTimetimestampDEFAULTCURRENTTIMESTAMPONUPDATECURRENTTIMESTAMP,RPint(11)DEFAULT0COMMENTRP值,sextinyintDEFAULT,IfLeaguertinyintNOTDEFAULT0,PRIMARYKEY(ApplyJoinId),KEYIndexOrgIdStatus(OrgId,ApplyStatus,IfDel),KEYIndexRTUser(UserId),KEYIndexCreateTime(CreateTime)USINGBTREE)ENGINEInnoDBAUTOINCREMENT22495957DEFAULTCHARSETutf8rowinset(0。00sec)
此外涉及的这张表的数据量有2000万左右,从目前的执行效率来看,无疑于走了一个全表扫描。
其实这个问题到了这个还是比较好理解的。从语句的表现,结合表结构,我们可以感觉到:整个SQL的执行过程中,原本是基于字段UserId,没想到却因为orderby中的CreateTime,导致索引选择错误,执行代价差异很大。
所以到了这里,我们如何来定性这个问题:
1)是因为orderby导致的吗?
2)是因为时间字段的排序导致的吗?
3)是因为limit操作导致的吗?
4)是因为userid本身的数据过滤效果差导致的吗?
对于这些疑问,我们可以很快通过几条对比SQL就能够快速验证。
通过如下的SQL可以看到orderby不是最主要的原因selectOrgIdfromtestcomm。applyjoinorgwhereIfDelandApplyStatusandUserId12345678ORDERBYCreateTime;Emptyset(0。01sec
orderby排序也不是最主要的原因selectOrgIdfromtestcomm。applyjoinorgwhereIfDelandApplyStatusandUserId12345678ORDERBYCreateTimedesc;Emptyset(0。01sec)
orderby排序limit10也不是最主要的原因selectOrgIdfromtestcomm。applyjoinorgwhereIfDelandApplyStatusandUserId12345678ORDERBYCreateTimedescLIMIT10;Emptyset(0。01sec)
orderby排序limit2也不是最主要的原因selectOrgIdfromtestcomm。applyjoinorgwhereIfDelandApplyStatusandUserId12345678ORDERBYCreateTimedescLIMIT;Emptyset(0。01sec)
而经过这些对比,主要加入了limit1,索引选择情况就会发生变化。我们抓取一条limit2的执行计划来看看。可以明显看到type为ref,此外ref部分差异很大(const)。explainselectOrgIdfromtestcomm。applyjoinorgwhereIfDel1andApplyStatus1andUserId12345678ORDERBYCreateTimedescLIMIT2G1。rowid:selecttype:SIMPLEtable:applyjoinorgpartitions:type:refpossiblekeys:IndexRTUserkey:IndexRTUserkeylen:ref:constrows:4854filtered:1。00Extra:Usingindexcondition;Usingwhere;Usingfilesortrowinset,1warning(0。00sec)
如果想得到更进一步的信息,可以使用如下的方式:SEToptimizertraceenabledonSELECTFROMINFORMATIONSCHEMA。OPTIMIZERTRACEG
查看
reconsideringaccesspathsforindexordering部分的信息会是关键所在。
indexprovidesorder:true,
orderdirection:desc,
而对于这个问题的分析,主要还是在于对于cost的评估方式,显然在目前的测试中,增加了额外的orderby排序操作,导致了代价会略微高一些,而在优化器中在评估中,显然这部分是缺失了一些信息导致判断失误。
有如下几种方式可以修复:
1)补充完整的复合索引,userid和CreateTime能够做到互补,该方案已经在同构环境中做了完整的模拟测试,能够达到预期altertabletestcomm。applyjoinorgdropkeyIndexRTUser;altertabletestcomm。applyjoinorgaddkeyIndexRTUser2(UserId,CreateTime);
2)使用forceindex的hint方式来强制索引,当然对于业务具有一定的侵入性
3)调整SQL逻辑模式,确实是否可以使用其他的方式来代替这种limit1的使用模式。
而从长计议,其实整个评估中的优化器还是比较薄弱的,对于索引选择中的判断依据,如果有了直方图等辅助信息,整个过程会更加如虎添翼,这块的内容,准备在8。0中进行一些模拟测试,稍后奉上测试结果。
有关自信的励志高考作文素材故事一:乔吉拉德自信的故事乔。吉拉德世界吉斯尼汽车销售冠军,是世界上最伟大的销售员,他连续12年荣登世界吉斯尼记录大全世界销售第一的宝座,他所保持的世界汽车销售纪录:连续……
冰心恋万里曾经三章万里曾经三章作者:冰心恋独立寒秋独立寒秋,记忆浮沉,心湖厚重烟笼。细数古今荣枯事,咸涩海水似人生。花落秋水朦胧,春去蝶不多情。百花溪畔,一群白鹭振翅,几……
我与亲人一起去打雪仗作文忽如一夜春风来,千门万户梨花开看着窗外纷飞的大雪,我不由得想起这句脍炙人口的名句。大地无声无息地穿上了银装,屋顶上、树枝上、广场上,都积了一层厚厚旳大雪,大地纯洁的像刚岀生的婴……
2017年安徽省中考满分作文这就是我的承诺张甲的高考分数线,超过了一本,能上一所很好的大学,这在农村是一件隆重的事。可在填志愿前,他一个人跑到爷爷的坟前。往事一幕一幕。三年前,爷爷还在世。那个插秧季节……
诗歌王玉明白露(外二首)白露作者:九龙布衣惊鸿舞动燕南飞,百鸟争鸣月夜陪。落叶摇情秋去处,收割火热大风微。寒露作者:九龙布衣南飞雁荡淡云天,雀变蛤……
诗歌张景旺不识字的父亲不识字的父亲作者:张景旺七十多岁的父亲一辈子也没有走出家乡的山岭薄地靠着一亩三分地养活着一家老小父亲常说人勤地不懒有耕耘就……
我的朋友优秀记叙文友谊是雨季里的小伞,撑起了一片晴天;友谊是寒夜里的一盏灯,燃烧着热情的火焰;友谊是一阵温馨的风,抚慰了受伤的心灵;友谊是一块洁白的手帕,拭干你腮边的泪痕。我有一个形影不离……
去图书馆400字优秀作文篇一:去图书馆周三下午第二节课,我们全班同学一起到图书馆看书,大家别提有多兴奋,这可是我们第一次到图书馆。走进图书馆,只见一排排美丽的图书整整齐齐地摆在书架上,散发……
诗歌焦方海耆老(外一首)耆老文焦方海心比雄鹰横空飞步行五里汗已挥七秩老翁恨岁老四肢糠衰健不归老想提诗激壮志搜肠刮肚字词亏梦里插翅越沟壑醒来绵软喘一……
飞鸟我,只是一个乱步与生命旅途中的落魄旅行者!如天空上落寞的飞鸟一样,漫无目的的在自己的旅途上行走着!像一个逃亡者,匆匆的来到一个城市,几天后,又匆匆的离开!我总想找到一个能……
好朋友和好朋友飞升城不需要唯唯诺诺的马前卒,飞升城需要一大拨真正的盟友剑来今天在看小说的时候,剑来当中的一句话,说的是飞升城,同时说的不也是平常当中的一些为人处事,怎么去交友吗?……
人生困惑婚姻给女人带来了什么你后悔结婚吗?如果可以选择,你还会结婚吗?这是两个直击女人灵魂的问题,很多女人也在反反复复的问自己,到底婚姻给我带来了什么?婚前,我是父母的小公主,我是老公的……
知青岁月那年麦收不平静1969年5月8日,我和同学们告别了家乡呼和浩特市,来到内蒙古生产建设兵团15团2连。刚刚熟悉了陌生的环境和出工劳动的生活,不久,农业连队最重的农活麦收会战就来临了。杜毓……
我的同桌粗心鬼作文有这么一个人,黝黑的脸上总是一副笑嘻嘻的表情。那两瓣兔子牙是他最明显的特征。他总以一副老实,可怜的样子来迷惑别人。但是是,与他相处久了,你就会发现他其实是一个不折不扣的粗心鬼,……
夜,雨的回忆清寂的夜,细雨绵绵。一伞紫色,从雨中慢慢悠悠走过,融进有点暖意的路灯下,画出了一块圆圆的天地。夜,踩着细长的倩影,穿过雨帘、灯光,晕着地。一枝碎花,风中落下一瓣瓣模……
恋蝶E度网专稿未经允许不得转载蝴蝶,是华丽的象征,蝴蝶,是飞翔在空中的仙子。蝴蝶的外表,令人爱恋,但蝴蝶那冲破屏障,化茧成蝶的勇气,却没多少人问津。春……
妈妈粥作文600字又是一个凌晨,太阳从地平线一跃而起,顿时,大家都为之一振。而我的身体,差点也要为之一振到床底下去。闭着眼睛穿好衣服,闭着眼睛走到洗脸池旁,闭着眼睛把牙刷伸进嘴里本想再闭着……
归乡的路(原创)修禅,随缘(原创)一山松涛浑厚的声响,震憾着山峦。松林卷着巨大的叶浪在山峦间起伏,成了一片深深辽阔的林海。云依偎着林海,飘拂着松林的叶香。林缠绕着白云,把枝叶播种在云端。……
我在考场上初中作文回顾往昔之峥嵘岁月,我感慨万千!学生时代对于每一个人来说都是一段叫人缠绵的记忆,很多人到老依旧怀念自己的孩提时代,想起小时候发生的一些事、遇到的一些人,不由地也会流出欣喜笑意。……
外婆的臭豆腐作文在平平淡淡的日常中,大家都有写作文的经历,对作文很是熟悉吧,借助作文可以提高我们的语言组织能力。你所见过的作文是什么样的呢?以下是小编收集整理的外婆的臭豆腐作文,仅供参考,希望……
我的奶奶五年级作文五篇奶奶已经年过六旬了,但仍然有着一头黑发,虽然个子不高,但依然精力充沛,她还有一双黑色的大眼睛。下面是我的奶奶五年级作文,欢迎参考!篇一:我的奶奶对于一般人来说,他们……
感恩奶奶300字作文导语:感恩奶奶300字作文范文有哪些?下面是小编为大家整理的文章,欢迎阅读!希望对大家有所帮助!感恩奶奶300字作文【一】在睁开眼睛的那一刹那,总会出现一个模糊疲惫的身影……
散文吃顿好的在我儿时的农村老家,小孩子们最爱听的话,是大人们说的:吃顿好的。老人们最怕听的话,是儿女们说的:吃点好的。在大家普遍不富裕的年代,吃,是衡量一个家庭过得好不好的重要指标,……
散文羊倌老六在我小时候的农村老家,最让人瞧不起的职业是羊倌。在那个年代,你要是做了羊倌,那就代表着你一没本事二没胆儿,不敢背井离乡去打工,只能窝在村子里挣口饭吃。这话也不算过分,当时的乡亲……