实战演练(二):运行20小时的报表SQL优化后秒出

  • 时间:
  • 浏览:13
  • 来源:uu快3IOS下载_uu快3app下载_和值

AND ALARM_LEVEL IN ( 1, 2, 3 )

straight_join (

id=2的每段,分成两块,先看靠前的那块, select type 是DEPENDENT SUBQUERY,看table每段是 是两个多 子查询,注意subquery3,就说 有具体的子查询是id=3的每段。 靠后的每段是两个多 简单的SQL。

join (

VEHICLE_ID

顶端的sql 运行10s 结果集为393653条数据,说明where 条件中的过滤条件的取舍率都是很好 不适合创建索引。

LEFT JOIN AREA ON AREA.ID = V.SYS_DIVISION_ID

straight_join V ON V.ID = F.VEHICLE_ID

VEHICLE_ID

explain extended

这是亲戚朋友 SQL优化班的两个多 学员,据说该SQL在生产环境中就说 运行了20个小时,快把服务器的磁盘资源耗尽了。这20个小时,亲戚朋友 可爱的学员就说 靠着删除怎么让 不重要的文件上上能勉速度过。

据了解,该SQL为两个多 月运行一次的跑报表的SQL,主要问题图片是随着SQL的运行时间没有长,所需的临时表空间也没有大,原因 磁盘资源用尽。

四、后记

本文作者:郑松华老师&小鹿

WHERE

一、概述

VEHICLE_ID

FROM

) s on F.VEHICLE_ID = s.VEHICLE_ID

FROM

straight_join DC ON DC.ID = F.CONST_ID

WHERE

AND ALARM_LEVEL IN ( 1, 2, 3 )

SELECT

最后运行了如下sql 结果集为 88696 速度为0.5s。采用join的办法替代in的办法,就说 DEPEND SUBQUERY是依赖于SQL的主体每段,执行的次数与被依赖表结果集一致。

FROM

sum( CASE WHEN F.DEAL_STATE = 0 THEN 1 ELSE 0 END ) AS DESTS

AND date( F.ALARM_TIME ) BETWEEN '800-01-01'

GROUP_ID IN ( SELECT GROUP_ID FROM GULK WHERE USER_ID = 'ff8080818091b09c0161f9b825780a9a' )

AND F.DEAL_STATE = 0

LEFT JOIN DC ON DC.ID = F.CONST_ID

希望给亲戚朋友 漫漫的SQL优化之旅,带来不一样的火花。

感谢亲戚朋友 细心观看,就说 亲戚朋友 要学习SQL优化,上能来「知数堂」跟着SQL优化班授课老师-松华老师,你知道的,别问我的,他都能教你。

AND ALARM_LEVEL IN ( 1, 2, 3 )

SELECT

SELECT

本文主要在于优化DEPEND SUBQUERY,另外让SQL上能用得上索引,让SQL的速度有着显著的提升。

WHERE

AND V.ID IS NOT NULL

COUNT( * ) AS totalNum,

sum( CASE WHEN F.ALARM_LEVEL = 3 THEN 1 ELSE 0 END ) AS LEVELS3,

UNION

 ●  问题图片定位

顶端的SQL 运行了0.5s 结果为180条 。in里的结果速度快 结果集很小 ,F表 就该结果进行in操作,也会有大幅度的过滤。

USER_ID = 'ff8080818091b09c0161f9b825780a9a'

F

VEHICLE_ID

SELECT

sum( CASE WHEN F.DEAL_STATE = 0 THEN 1 ELSE 0 END ) AS DESTS

UNION

四、SQL优化结果

AND AREA.PATH LIKE CONCAT( ( SELECT ARE.PATH FROM ARE WHERE ARE.ID = '0' ), '%' )

UVLK

sum( CASE WHEN F.ALARM_LEVEL = 2 THEN 1 ELSE 0 END ) AS LEVELS2,

SELECT

SELECT

GVLK

AND '2018-08-14'

id=3的每段,select type是MATERIALIZED ,table 是 UVLK,位于物化视图的是子查询每段中的子查询每段,物化子查询,一般突然老出物化视图说明子查询中位于嵌套子查询,且是与SQL主体每段完整篇 无关的表,且子查询中并未使用到索引。

原文发布时间为:2018-10-31

WHERE

straight_join AREA ON AREA.ID = V.SYS_DIVISION_ID

SELECT

执行计划中上能看出,GVLK, GULK, UVLK 每段均使用了DEPEND SUBQUERY,是性能的瓶颈,DEPEND SUBQUERY是依赖于SQL的主体每段,它的执行次数最大就说 和SQL主体每段结果的行数(448612行)一样多,一齐,,GVLK, GULK,UVLK几张表的type都为all,并为使用到索引,MySQL中关联未走索引的表,上能nested loop join(将驱动表/内部人员表的结果集作为循环基础数据,怎么让 循环从该结果集每次一条获取数据作为下两个多 表的过滤条件查询数据,怎么让 合并结果。),多表 join的结果就说 ,临时结果集会非常非常的大。

FROM

id=1的列就说 刚结束了,上能看出 F表,DC表,V表,AREA表都属于id=1的,原因 是亲戚朋友 使用了left join,都属于同两个多 层级。

二、先看慢SQL

USER_ID = 'ff8080818091b09c0161f9b825780a9a'

COUNT( * ) AS totalNum

GROUP_ID IN ( SELECT GROUP_ID FROM GULK WHERE USER_ID = 'ff8080818091b09c0161f9b825780a9a' )

FROM

AND AREA.PATH LIKE CONCAT( ( SELECT ARE.PATH FROM ARE WHERE ARE.ID = '0' ), '%' )

AND ALARM_LEVEL IN ( 1, 2, 3 )

FROM

GVLK

LEFT JOIN V ON V.ID = F.VEHICLE_ID

AND F.VEHICLE_ID IN (

三、SQL优化过程

该执行计划怎么看:

F

WHERE GROUP_ID IN ( SELECT GROUP_ID FROM GULK WHERE USER_ID = 'ff8080818091b09c0161f9b825780a9a' )

WHERE F.DEAL_STATE = 0

WHERE

SELECT

GVLK

) s

FROM

COUNT( * ) AS totalNum,

)

FROM

FROM

id=4每段,是两个多 DEPENDENT UNION ,将id=2的DEPENDENT SUBQUERY进行union

GROUP_ID IN ( SELECT GROUP_ID FROM GULK WHERE USER_ID = 'ff8080818091b09c0161f9b825780a9a' )

 ●  查看执行计划 

UNION

WHERE

UVLK

DC.ID IS NOT NULL

sum( CASE WHEN F.ALARM_LEVEL = 1 THEN 1 ELSE 0 END ) AS LEVELS1,

WHERE

F

AND F.ALARM_TIME BETWEEN '800-01-01' AND '2018-08-14'

UVLK

GVLK

WHERE

上述SQL的含义:将F左连DC ,V,AREA表的结果进行where过滤,where中位于子查询,怎么让 还有like函数

2、修改后的搞笑的话上能使用到索引,索引为F.const_id,table为。这里值得一提的是,采用straight_join 代替 了 join,保证了SQL执行顺序一定是按照亲戚朋友 SQL书写的顺序。

AND date( F.ALARM_TIME ) BETWEEN '800-01-01'

AND F.VEHICLE_ID = s.VEHICLE_ID

DC.ID IS NOT NULL

VEHICLE_ID

F

WHERE USER_ID = 'ff8080818091b09c0161f9b825780a9a'

SELECT

VEHICLE_ID

UNION

FROM

VEHICLE_ID

FROM

1、使用join 代替in的办法;

sum( CASE WHEN F.ALARM_LEVEL = 1 THEN 1 ELSE 0 END ) AS LEVELS1,

id=5每段,是两个多 子查询,是concat函数的主体每段

AND F.ALARM_TIME BETWEEN '800-01-01' AND '2018-08-14'

null每段,union result,是将union的结果集,使用了 using tempory。

优化的原理就说 在优化过程中完整篇 讲解,速度提升上万倍,原因 如下:

COUNT( * ) AS totalNum

FROM

WHERE F.DEAL_STATE = 0

sum( CASE WHEN F.ALARM_LEVEL = 2 THEN 1 ELSE 0 END ) AS LEVELS2,

VEHICLE_ID

SELECT

UVLK

优化后的SQL的执行时间几乎是秒出。

AND F.DEAL_STATE = 0

AND V.ID IS NOT NULL

USER_ID = 'ff8080818091b09c0161f9b825780a9a'

SELECT

sum( CASE WHEN F.ALARM_LEVEL = 3 THEN 1 ELSE 0 END ) AS LEVELS3,

SELECT

AND '2018-08-14'