优化这条sql select count(0) from ( SELECT count(0) FROM t_order_repair_item a LEFT JOIN t_inventory b ON a.inventory_id = b.inventory_id LEFT JOIN t_inventory_shot c ON b.inventory_shot_id = c.id WHERE a.sub_order_id IN ( SELECT so.sub_order_id FROM t_sub_order so left JOIN t_linkman lm ON so.lnk_id = lm.lnk_id WHERE so.del_flag !=1 and date_format(so.create_time,'%Y-%m') = '2023-01' ) and c.type in(0,1) GROUP BY a.sub_order_id ) t
时间: 2024-01-27 21:06:33 浏览: 325
可以尝试以下几个方面进行优化:
1. 添加索引:为了加快查询速度,可以对 t_order_repair_item、t_inventory、t_inventory_shot、t_sub_order、t_linkman 表的相关字段添加索引。
2. 使用 EXISTS 替换 IN 子查询:在该 SQL 中,IN 子查询嵌套层数较深,可以考虑使用 EXISTS 替换 IN 子查询来提高性能。
3. 简化 COUNT 操作:可以通过修改 GROUP BY 子句和 SELECT 子句,简化 COUNT 操作,从而提高性能。例如,可以将 SELECT 子句中的 COUNT(0) 修改为 COUNT(DISTINCT a.sub_order_id),并将 GROUP BY 子句中的 a.sub_order_id 修改为 1。
4. 避免使用函数:可以避免使用函数,如该 SQL 中的 DATE_FORMAT 函数,因为函数会消耗性能。
优化后的 SQL 如下所示:
```
SELECT COUNT(DISTINCT a.sub_order_id)
FROM t_order_repair_item a
LEFT JOIN t_inventory b ON a.inventory_id = b.inventory_id
LEFT JOIN t_inventory_shot c ON b.inventory_shot_id = c.id
WHERE EXISTS (
SELECT 1
FROM t_sub_order so
LEFT JOIN t_linkman lm ON so.lnk_id = lm.lnk_id
WHERE so.del_flag != 1
AND date_format(so.create_time,'%Y-%m') = '2023-01'
AND a.sub_order_id = so.sub_order_id
)
AND c.type IN (0, 1);
```
请注意,以上仅是一些可能的优化方向,具体的优化方案需要根据具体情况进行调整。
阅读全文