SELECT orders.GUIZI_NO AS cabNo, CAST(SUM(ordinPost.amount) AS DECIMAL(14,2)) AS orderMoney
FROM
(
SELECT order_water_code, amount
FROM wallet_pay_post_record t
WHERE t.create_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
AND t.`status` = 1
) ordinPost
INNER JOIN guizi_order orders ON ordinPost.order_water_code = orders.TRADE_WATER_NO
GROUP BY orders.GUIZI_NO
HAVING orderMoney < '200.00'
wallet_pay_post_record 这个表有1亿多条数据,查询统计很慢,问了create_time加索引好像也提高不了多少速度。
执行计划
sql逻辑上进行优化
1 在内层先对wallet_pay_post_record 表根据order_water_code字段进行group by操作,减少INNER JOIN的数据量
2 如果wallet_pay_post_record和guizi_order 是多对一的关系,amount<200的条件可以移到内层先处理。