优化sql,测试环境可以,正式环境直接无了

各位帮我看看那有没有优化的可能了。这个sql在测试环境需要五六秒钟,正式环境直接超时无了


SELECT
    d.AREANO,
    SUM(c.ORDERQTY) - SUM(c.DELIQTY) num
FROM
    db.TBSOYF012 c
LEFT JOIN db.TBSOYF011 b ON
    c.compId = b.compId
    AND b.orderNo = c.orderNo
LEFT JOIN db.TBSBYF01 a
ON
    a.COMPID = b.COMPID AND a.TRANSPORTWAYNO = b.transType
LEFT JOIN DB.TBSHYF18 d ON
    c.compId = d.compId
    AND a.AREANO = d.SEQNO
WHERE
    c.compId = 'yf'
    AND b.transType = 'T'
    AND c.CREDATE <= '20200928'
    AND c.CREDATE >= '20200928'
    AND b.PRODTYPE LIKE 'H%'
    AND c.STATUS != 'X'
GROUP BY
    d.AREANO

使用索引:
CREATE INDEX idx_TBSOYF012_compId_CREDATE ON db.TBSOYF012 (compId, CREDATE);
CREATE INDEX idx_TBSOYF011_compId_orderNo_transType_PRODTYPE ON db.TBSOYF011 (compId, orderNo, transType, PRODTYPE);
CREATE INDEX idx_TBSBYF01_COMPID_TRANSPORTWAYNO ON db.TBSBYF01 (COMPID, TRANSPORTWAYNO);
CREATE INDEX idx_TBSHYF18_compId_SEQNO ON db.TBSHYF18 (compId, SEQNO);

方案来自 梦想橡皮擦 狂飙组基于 GPT 编写的 “程秘”

要优化这个查询的话,需要根据具体的数据情况和数据表的结构来进行分析。具体的优化建议如下:

建立索引: 对于查询中的多个表的关联字段,建立索引可以加速查询,尤其是对于大表的关联。

优化表结构: 尽量避免使用 TEXT 或 BLOB 等字段类型,因为它们不能被索引。

减少表的关联: 对于不必要的表的关联,可以考虑去掉。

使用合适的存储引擎:不同的存储引擎对于不同的数据类型有不同的优势,使用合适的存储引擎可以提高查询的性能。

缩小数据范围:通过 WHERE 子句尽量缩小查询的数据范围,以减少需要处理的数据量。

sql优化,首先通过先添加 explain 关键字,来解释下sql 在执行查询的时候会进行什么操作,主要看type字段,一般来说花费时间,const < e_ref < ref <range < index < all,一般查询来说,保持至少在range,最好在ref这个水平。通过建立索引的方式可以进行逐步优化。然后以此为标准进行操作

连接一般超过三个就不建议使用连接去作为常用查询,连接的表越多,效率就会越低,如果非要这样,那就给查询条件的那些字段加上索引试试看,或者不用这个sql,可以采用创建视图,临时表等来实现查询