授权中心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语句做一次全面检测
谢谢大家!