qq_46318731 2022-09-16 10:19 采纳率: 0%
浏览 32

关于#SQL优化#的问题,如何解决?

问题遇到的现象和发生背景

问题背景:写了一段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.`推广项目`

运行结果及报错内容

img

我的解答思路和尝试过的方法

也试图通过设置索引来减少运行时间,但是没有什么效果。

我想要达到的结果

希望各位帮帮忙,帮优化下,减少运行的时间,感谢!

  • 写回答

3条回答 默认 最新

  • yedelzx 2022-09-16 10:39
    关注

    你这个脚本,索引感觉是比较难去建的,要很多地方考虑失效,但是如果你这个脚本只是用来统计的话,不是放代码里的,那就没事,时间久一点就久一点,毕竟分组查,又连表,又是子查询的,数据稍微一多,肯定慢,如果sql结构改不了的话,那加索引其实也慢

    评论

报告相同问题?

问题事件

  • 创建了问题 9月16日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题