上传源代码版本

This commit is contained in:
Im-Jenisson
2026-06-01 16:30:29 +08:00
commit b2a9b7d3c2
462 changed files with 104365 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
# SQL查询性能优化方案
## 优化目标
`最新运营监控.sql``客户维度运营监控.sql`的查询耗时从当前的2分钟降低到30秒以内
## 性能瓶颈分析
当前SQL执行慢的主要原因
1. **多表关联复杂度高**存在多次LEFT JOIN、CROSS JOIN关联数据量较大
2. **重复扫描同一张表**多个CTE独立扫描`label_scan_history``label_replace_requests`重复IO开销大
3. **子查询效率低**部分指标使用EXISTS子查询逐行判断效率低
4. **索引缺失**:常用关联字段、过滤字段缺少有效索引,查询时全表扫描
5. **计算逻辑重复**:日期转换、维度判断等逻辑在多处重复计算
## 优化方案(按优先级排序)
### 方案一:索引优化(实施成本最低,效果最明显)
#### 需创建的索引:
| 表名 | 索引字段 | 用途 |
|------|----------|------|
| `label_scan_history` | `NeutralWaybillNumber, CreatedAt, Result, Description` | 覆盖扫描记录的关联、过滤、统计需求,避免回表 |
| `label_scan_history` | `CreatedAt, Result, NeutralWaybillNumber` | 覆盖独立统计CTE的统计需求直接从索引获取统计数据 |
| `label_replace_requests` | `MasterPackageNumber, BillOfLadingNumber, customerid, LabelRetrievedAt` | 覆盖订单表的关联、过滤需求 |
| `arrival_handover_forms` | `HandoverNumber` | 覆盖交接单匹配关联需求 |
| `customers` | `Id, CustomerCode` | 覆盖客户维度关联需求 |
> 所有索引均为组合索引,实现查询全覆盖,避免回表查询
### 方案二SQL逻辑优化无额外开发成本仅修改SQL结构
1. **合并重复CTE**:将多个独立扫描`label_scan_history`的CTE合并为一个一次性计算所有扫描相关指标成功数、失败数、STOP数、扫描数减少表扫描次数
2. **替换CROSS JOIN**:将`DistinctDates CROSS JOIN OrderFullInfo`改为更高效的关联方式,减少笛卡尔积计算量
3. **移除不必要的逻辑**:删除冗余的判断条件和重复计算逻辑
4. **替换EXISTS子查询**将指标统计中的EXISTS子查询改为预计算的关联方式
### 方案三:中间汇总表方案(适合准实时场景,性能提升最大)
创建定时任务每15分钟/每小时执行一次),预计算以下中间结果:
1. `daily_scan_stats`每日扫描统计结果日期、扫描数、成功数、失败数、STOP数
2. `daily_order_stats`:每日订单统计结果(日期、新增换单数、应该换单数、标签推送数等)
3. `customer_daily_stats`:客户维度每日统计结果
查询时直接读取预计算的汇总表,查询耗时可降低到秒级
### 方案四物化视图方案适合MySQL 8.0+版本)
创建物化视图预计算常用的统计维度,自动刷新数据,查询时直接读取物化视图
## 实施步骤
### 第一步先实施索引优化1小时内完成
1. 创建上述所有建议的组合索引
2. 重新执行SQL测试性能预计可降低50%以上的耗时
### 第二步实施SQL逻辑优化2小时内完成
1. 重构SQL结构合并重复CTE
2. 优化关联逻辑和子查询
3. 测试验证数据准确性和性能提升
### 第三步:(可选)实施中间汇总表方案(半天内完成)
1. 设计汇总表结构
2. 开发定时汇总脚本
3. 修改查询SQL读取汇总表
## 预期效果
- 仅实施索引+SQL逻辑优化查询耗时可降低到30-60秒
- 实施中间汇总表方案查询耗时可降低到1-5秒
## 验证标准
1. 查询耗时≤30秒
2. 统计结果和原SQL完全一致
3. 无业务逻辑偏差