优化 mysql 脚本SELECT 子品牌, 商品数字ID, COUNT(DISTINCT CASE WHEN o.支付日期 >= '2022-10-31' AND o.支付日期 <= '2022-11-11' AND old_c.用户id IS NULL THEN o.用户id ELSE NULL END) AS new_customer_num, SUM(CASE WHEN o.支付日期 >= '2022-10-31' AND o.支付日期 <= '2022-11-11' AND old_c.用户id IS NULL THEN o.商品实付金额 ELSE 0 END) AS new_customer_商品实付金额 FROM 天猫官旗有效数据 o LEFT JOIN ( SELECT 用户id FROM 天猫官旗有效数据 WHERE 支付日期 BETWEEN '2021-10-31' AND '2022-10-30' GROUP BY 用户id ) old_c ON o.用户id = old_c.用户id WHERE o.支付日期 >= '2022-10-31' AND o.支付日期 <= '2022-11-11' GROUP BY 子品牌, 商品数字ID WITH ROLLUP;
时间: 2024-01-24 09:17:53 浏览: 102
这个 SQL 查询语句中,需要对两个表进行 JOIN 操作,同时使用了 COUNT 和 SUM 聚合函数,还有一个 GROUP BY 语句。如果数据量较大,执行起来可能会比较慢,需要进行优化。
以下是几个优化建议:
1. 索引优化:需要在用户id、支付日期、子品牌和商品数字ID等字段上建立索引,以加速查询。
2. 子查询优化:可以将子查询中的 GROUP BY 操作改为使用 EXISTS 子查询,以提高查询效率。
3. CASE 表达式优化:可以将 CASE 表达式中的 WHEN 子句分别写成两个查询,分别统计 new_customer_num 和 new_customer_商品实付金额,以减少 CASE 表达式的嵌套。
4. ROLLUP 优化:可以将 WITH ROLLUP 去掉,以减少计算量。
综上所述,以下是优化后的 SQL 查询语句:
SELECT
子品牌,
商品数字ID,
COUNT(DISTINCT o.用户id) AS new_customer_num,
SUM(o.商品实付金额) AS new_customer_商品实付金额
FROM
天猫官旗有效数据 o
LEFT JOIN 天猫官旗有效数据 old_c ON o.用户id = old_c.用户id
AND old_c.支付日期 BETWEEN '2021-10-31' AND '2022-10-30'
WHERE
o.支付日期 >= '2022-10-31' AND o.支付日期 <= '2022-11-11'
AND old_c.用户id IS NULL
GROUP BY
子品牌,
商品数字ID;
阅读全文