MySQL 八怪(高老师)现场解决问题实录
开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2260人左右 1 + 2 + 3 + 4 +5) 新人奖直接分配到5群,5群超过300 已建立6群,另欢迎 OpenGauss 的技术人员加入。
最近感觉,的确是不够用,手指头不够用,群里每天都有有意思的事情,正在准备下一步临时工访谈,一个更有意思刺激的故事,这就遇上群里高老师现场解决问题,高老师是MySQL业界的实战派,出现在群里呢,属于老神仙出山你算不出那天来,估计每天都是忙到想撞墙的地步。
实录开始:
这里临时工也稍微的围观和凑合了一下,针对这个同学给出了,事务内和事务外部的TRACE 的文件。(基于隐私和我也没有和这个同学问是否可以把名字 SHOW 出来,只能隐去),这里trace 的文件太大了,我没有办法贴到这里,贴完,估计诸位的手机流量都要爆了。
我就把我昨天,分析这两个TRACE 文件的截图贴上来,方便诸位了解相关的情况。我这里把不一致的部分贴上来。8400多行我也不能都截图,那样电脑也的爆掉,所以只能截取两个语句在比对中不同的部分。
一开始是没有什么不同的,到后面,在行评估的部分开始,就有不同了。这里说梦一下,在各位看官左手的文档是没有事务的,在右手的是在事务中的。
开始出不同了,明显在不在事务内的语句,执行的时候,在使用索引评估时的行部分,有了较大的差异,可以明显看出,在非事务的rows 评估要比事务内的查询语句的 rows 行评估要大一倍,自然COST 也就不一致了
在下面的大部分TRACE 的文件比对的部分,都是有类似的情况,大表基本上行数是没有变化的,所有COST值没有相关的大的变化,而只要涉及到一些ROWS 较小的时候,就会产生较大的差异。
后面我也是是在截图不下去,我才截图5分之一,大部分情况都是这样,到后面整体执行计划部分就都变味了。
到这里结束,其中有一个同学提出,事务隔离级别与锁的问题,导致的执行计划方面的不同。
同时高老师也提出一个问题,关于在事务内,你的事务是否对这些表有变化的问题,比如你删除了表里面的数据,或者UPDATE 或者做其他的操作等。
那个同学回答,是的,的确在事务中有相关的对于表的更改。
整体的问题解决结束。
后面同学又拿出相关的执行计划,下面的是事务外的
这张是事务内的
可以很清晰的看到,相关的索引在两个部分里面选择是不同的。
http://mysql.taobao.org/monthly/2020/03/08/
另外还有一个问题关于这个同学提出的,HINT 部分的问题,高老师也给出图了。
这里补充一些信息,方便不清楚的同学理解, 在MYSQL 中是可以进行HINT的,当多表在进行JOIN 的时候,使用了STRAIGHT_JOINDE 时,MySQL 按照他在查询中的列出的链接顺序链接表,根据不同的链接测量的成本估算对标进行重新的排序,通过straight_join来强制MYSQL按照指定的顺序来进行表的链接顺序的重新制定。
到此为止,整体的事情基本说明白了。
总结一下,
1 事务中,如果查询处于整体事务的下方,同时上方又有相关对查询表的一些数据的修改,那么当达到了一定的表的修改的数量级别,就会对表的统计分析进行变更。
2 在事务中,表的统计分析的数据变更后,整体的执行计划必然会重新调整,如上图,那么就会导致查询计划的变化。出现提出问题同学中关于事务内核事务外部执行同样的语句,但执行的时间的变化。
处理方法是,找到最优的执行方式,并对在事务中执行的查询语句添加HINT 来解决相关的问题。
————————————————————————————
后记:大佬们在解决问题的时候,主要是短平快,他的目的是解决问题,而不是在短时间去分析问题,我们在提问题的时候,应该给付充足的信息如同提出问题的同学,给出的信息比较详细,方便快速定位问题解决问题。
再次感谢 高老师 (八怪)
往期热门文章: