问题遇到的现象和发生背景
问题背景:写了一段MySQL脚本,是可以运行并实现需求的,但是就是运行的时间太长了,4分钟左右,想要问问各位,如何优化我这个脚本呢?
用代码块功能插入代码,请勿粘贴截图
#############修改时间#####################
SET @LastFirstTime := '2022-07-01';
SET @LastEndTime := '2022-07-31';
SET @FirstTime := '2022-08-01';
SET @EndTime := '2022-08-31';
##
DROP TABLE IF EXISTS lstable;
##
CREATE TABLE lstable (
##常规
SELECT
DISTINCT
cgtfc.`时间` 日期,
'常规' cname,
CONCAT(cgtfc.`站点ID`,cgtfc.`站点名称`) '站点id+名称',
cgtfc.`站点ID`,
cgtfc.`负责人`,
SUM(`cgtfc`.`现金`) AS `现金`,
SUM(`cgtfc`.`流水`) AS `流水`,
SUM(`cgtfc`.`名片量`) AS `名片量`,
cgtfc.`广告商`,
cgtfc.`账户`,
cgtfc.`推广项目`
FROM cgtfc
WHERE cgtfc.`广告商` NOT LIKE '%KOL%'
AND
(cgtfc.`时间` BETWEEN @LastFirstTime AND @LastEndTime
OR
cgtfc.`时间` BETWEEN @FirstTime AND @EndTime)
GROUP BY
cgtfc.`时间`,
concat( cgtfc.`站点ID`, cgtfc.`站点名称` ),
cgtfc.`站点ID`,
cgtfc.`负责人`,
cgtfc.`广告商`,
cgtfc.`账户`,
cgtfc.`推广项目`
#
UNION ALL
##BF
SELECT
DISTINCT
bfc.`日期`,
'BF' cname,
bfc.`站点id+名称`,
bfc.`站点id`,
bfc.`负责人`,
bfc.`现金`,
bfc.`流水`,
(CASE WHEN bfc.`名片量`=0
THEN (CASE WHEN bfb.`名片量` IS NULL
THEN 0
ELSE bfb.`名片量`
END )
ELSE bfc.`名片量`
END ) 名片量,
bfc.`广告商`,
bfc.`账户`,
bfc.`推广项目`
FROM
(SELECT
bf.`日期`,
CONCAT(bf.`站点id`,bf.`站点名称`) '站点id+名称',
bf.`站点id`,
bf.`负责人`,
SUM(bf.`现金`) 现金,
SUM(bf.`流水`) 流水,
SUM(bf.`小课支付单数`) 名片量,
bf.`广告商`,
bf.`账户`,
bf.`推广项目`
FROM (
SELECT * FROM `bf运营报表`
WHERE `bf运营报表`.`日期` BETWEEN @LastFirstTime AND @LastEndTime
OR
`bf运营报表`.`日期` BETWEEN @FirstTime AND @EndTime
UNION
SELECT * FROM bfls
WHERE bfls.`日期` BETWEEN @LastFirstTime AND @LastEndTime
OR
bfls.`日期` BETWEEN @FirstTime AND @EndTime
)bf
GROUP BY
bf.`日期`,
CONCAT(bf.`站点id`,bf.`站点名称`),
bf.`站点id`,
bf.`负责人`,
bf.`广告商`,
bf.`账户`,
bf.`推广项目`
) bfb
RIGHT JOIN
(SELECT
bftfc.`日期`,
bftfc.`站点id+名称`,
bftfc.`站点` 站点id,
bftfc.`负责人`,
SUM(bftfc.`现金`) 现金,
SUM(bftfc.`订单流水`) 流水,
SUM(bftfc.`小课支付订单量`) 名片量,
bftfc.`广告商`,
bftfc.`账户`,
bftfc.`推广项目`
FROM bftfc
WHERE
bftfc.`日期` BETWEEN @LastFirstTime AND @LastEndTime
OR
bftfc.`日期` BETWEEN @FirstTime AND @EndTime
GROUP BY
bftfc.`日期`,
bftfc.`站点id+名称`,
bftfc.`站点`,
bftfc.`负责人`,
bftfc.`广告商`,
bftfc.`账户`,
bftfc.`推广项目`
) bfc
ON bfc.`日期`=bfb.`日期`
AND bfc.`站点id`=bfb.`站点id`
AND bfc.`负责人`=bfb.`负责人`
WHERE
bfc.`广告商` NOT LIKE '%KOL%'
);
################################################################
################################################################
SELECT DISTINCT
MONTH(vt.`日期`) 月份,
# vt.`日期`,
vt.cname,
# vt.`站点ID`,
vt.`负责人`,
vt.`广告商`,
# vt.`账户`,
vt.`推广项目`,
SUM(vt.`现金`) 现金,
SUM(vt.`流水`) 流水,
# vt.`名片量` 第一天名片量,
# a.`名片量` 第二天名片量,
# b.`名片量` 第三天名片量,
# c.`名片量` 第四天名片量,
# d.`名片量` 第五天名片量,
# e.`名片量` 第六天名片量,
# f.`名片量` 第七天名片量,
SUM(vt.`名片量`) 当天空名片,
SUM((CASE WHEN a.`名片量` IS NULL
THEN 0
ELSE a.`名片量`
END)+(CASE WHEN b.`名片量` IS NULL
THEN 0
ELSE b.`名片量`
END)+(CASE WHEN vt.`名片量` IS NULL
THEN 0
ELSE vt.`名片量`
END)
) 连续三天,
SUM((CASE WHEN a.`名片量` IS NULL
THEN 0
ELSE a.`名片量`
END)+(CASE WHEN b.`名片量` IS NULL
THEN 0
ELSE b.`名片量`
END)+(CASE WHEN vt.`名片量` IS NULL
THEN 0
ELSE vt.`名片量`
END)+(CASE WHEN c.`名片量` IS NULL
THEN 0
ELSE c.`名片量`
END)+(CASE WHEN d.`名片量` IS NULL
THEN 0
ELSE d.`名片量`
END)+(CASE WHEN e.`名片量` IS NULL
THEN 0
ELSE e.`名片量`
END)+(CASE WHEN f.`名片量` IS NULL
THEN 0
ELSE f.`名片量`
END)
) 连续七天
FROM
lstable vt
LEFT JOIN
lstable a
ON vt.`日期`=DATE_ADD(a.`日期`,interval -1 DAY) AND vt.`站点id`=a.`站点id`
LEFT JOIN
lstable b
ON vt.`日期`=DATE_ADD(b.`日期`,interval -2 DAY) AND vt.`站点id`=b.`站点id`
LEFT JOIN
lstable c
ON vt.`日期`=DATE_ADD(c.`日期`,interval -3 DAY) AND vt.`站点id`=c.`站点id`
LEFT JOIN
lstable d
ON vt.`日期`=DATE_ADD(d.`日期`,interval -4 DAY) AND vt.`站点id`=d.`站点id`
LEFT JOIN
lstable e
ON vt.`日期`=DATE_ADD(e.`日期`,interval -5 DAY) AND vt.`站点id`=e.`站点id`
LEFT JOIN
lstable f
ON vt.`日期`=DATE_ADD(f.`日期`,interval -6 DAY) AND vt.`站点id`=f.`站点id`
WHERE vt.`名片量`=0
GROUP BY
MONTH(vt.`日期`),
# vt.`日期`,
vt.cname,
# vt.`站点ID`,
vt.`负责人`,
vt.`广告商`,
# vt.`账户`,
vt.`推广项目`
运行结果及报错内容
我的解答思路和尝试过的方法
也试图通过设置索引来减少运行时间,但是没有什么效果。
我想要达到的结果
希望各位帮帮忙,帮优化下,减少运行的时间,感谢!