授权中心update语句执行效率分析

​​​


 

    上周授权中心出现UPDATE语句,有生成衍生表时情况分析,5.5执行非常快,5.7执行慢的原因分析

 

   对上周授权中心问题SQL跟综与分析结果:

以下图片与分析报告主要对四种情况分析

1 MYSQL5.7版本对update语句加指定驱动straight_join与不加straight_join情况

2 MYSQL5.7版本对select语句加指定驱动straight_join与不加straight_join情况

3 MYSQL5.5版本对select语句加指定驱动straight_join与不加straight_join​情况

4 MYSQL5.5版本对update语句加指定驱动straight_join与不加straight_join​情况

 

 

1-----5.7 SQLTRACE追综结果分析

(1)--5.7对update  

            不加指定驱动straight_join 

-                5.7对update语句中的衍生表自动加上指定驱动表的指定顺序。

 

 

 

(2)--5.7对update

            指定驱动straight_join 

-                按指定straight_join ,与不指定驱动情况一样,这里不做分析

 

2-----5.7 SQLTRACE追综结果分析

      (1)--5.7对select

            不加指定驱动straight_join 

 

            对select不加指定驱动straight_join 的情况,5.7不会自动加上straight_join 

 

-----对select 语句,5.7不会自动加上straight_join,所以衍生表中的select是执行非常快的

 

--结果太长,连接上面查询。非常快的

 

(2)--5.7对select

            指定驱动straight_join ​

 

            对select指定驱动straight_join 的情况,语句执行就很慢了

 

 

---问题执行计划,

 

 

---select 语句

--访问时间,驱动表指定,错误的执行计划执行时间达到了12秒多

 

 

 这里5.7结论 ,对update语句有衍生表时,5.7会自动给衍生表里加上指定驱动,对SELECT语句,不会指定驱动,让优化器自动选 择驱动

 

---

3-----5.5 SQLTRACE追综结果分析(5.5不支持trace)

(1)--5.5对select

            不加指定驱动straight_join 

--5.5不支持trace​,改为extentd查看语句改写情况

      --不加straight_join情况,5.5不会自动加上straight_join,执行时间就会很快


 

 

(2)--5.5对select

            指定驱动straight_join 

 

-     5.5上执行straight_join指定驱,执行是非常慢的


 

--改写情况,只能通过extentd,查看语句,改写执行计划不会,按straight_join指定执行


 

---使用straight_join情况,计划不会变,执行时间也是会非常长的时间


--时长10多秒


 

 

4-----5.5 SQLTRACE追综结果分析(5.5不支持trace)

(1)--5.5对update

            不加指定驱动straight_join 

--5.5同样不支持update直接看执行计划(没法跟综)

***星号以内是个猜想

 ***不过我们通过上面的分析,5.5对让优化器自己选择驱动表,会走正确认执行计划。5.5指定了驱动表,和5.7会优化器改写后一样的慢***

 

 

 

总结: 通过上面的分析,可以大致认为是表的执行顺序错误,导致5.7执行非常慢,而5.7对UPDATE的衍生表是自动加上straight_join 。

所以建议大家,对UPDATE语句,尽可能使用子查询代替衍生表,而UPDATE尽可能不要做太多关联,或者使用临时表方案处理。对MYSQL版本升级,需要对SQL语句做一次全面检测

 

谢谢大家!​

 

 

 

 

posted @ 2020-05-08 09:13  java林森  阅读(295)  评论(0编辑  收藏  举报