求救 救救孩子吧 Mysql查询超时
mysql吧
全部回复
仅看楼主
level 1
接到一个需求,查询某个时间段内,新老买家的占比。新买家指的是统计时间以前没有订单记录的用户。 统计时间内数据80w+, 统计时间之前数据量 1700w+。 下面是我写的查询,请大佬帮忙看看怎么优化吧[泪][泪][泪] 求求了[乖] 看执行计划 extra里有 filesort, 但是想不到优化方法了
2023年09月26日 06点09分 1
level 1
select case when 网页链接 is not null then 'oldBuyer'
else 'newBuyer' end new_or_old,count(tb1.buyerID) as buyerCnt, sum(tb1.amt) as amt, sum(orderCnt) as orderCnt
from(select oaid as buyerID, sum(authorization_amount ) as amt, count(id ) as orderCnt
from t_apple_order
where payment_time between '2022-09-09 20:00:00' AND '2022-09-10 23:59:59'
group by oaid ) tb1
INNER join
(select distinct oaid as buyerID
from t_apple_order
where payment_time <= '2022-09-09 19:59:59') tb2
on 网页链接 = 网页链接 group by case when 网页链接 is not null then 'oldBuyer'
else 'newBuyer' end
2023年09月26日 06点09分 2
level 1
这个是查询语句 大佬们 帮忙看看 谢谢啦
2023年09月26日 06点09分 3
level 5
子查询优化:您的查询中使用了两个子查询,可以尝试将其合并为一个子查询,减少查询的次数。这样可以减少查询的开销并提高性能。
避免使用 DISTINCT:在第二个子查询中使用了 DISTINCT 关键字,这可能会导致性能下降。如果可能的话,可以考虑其他方式来避免使用 DISTINCT,例如使用 GROUP BY 来获取唯一的 buyerID。
避免不必要的列操作:在主查询中使用了 SUM(orderCnt) as orderCnt,但是在子查询中并没有使用 orderCnt,因此可以避免在主查询中进行这个操作,以提高性能。
SELECT
CASE WHEN tb2.buyerID IS NOT NULL THEN 'oldBuyer' ELSE 'newBuyer' END AS new_or_old,
COUNT(tb1.buyerID) AS buyerCnt,
SUM(tb1.amt) AS amt
FROM
(
SELECT
oaid AS buyerID,
SUM(authorization_amount) AS amt
FROM
t_apple_order
WHERE
payment_time BETWEEN '2022-09-09 20:00:00' AND '2022-09-10 23:59:59'
GROUP BY
oaid
) tb1
LEFT JOIN
(
SELECT
oaid AS buyerID
FROM
t_apple_order
WHERE
payment_time <= '2022-09-09 19:59:59'
GROUP BY
oaid
) tb2 ON tb1.buyerID = tb2.buyerID
GROUP BY
CASE WHEN tb2.buyerID IS NOT NULL THEN 'oldBuyer' ELSE 'newBuyer' END
2023年09月28日 00点09分 5
1