# 数据统计模块数据库索引优化建议

## 概述
为了优化数据统计API的查询性能，建议为以下字段添加数据库索引。这些索引将显著提高统计查询的速度，特别是在大数据量下。

## 推荐索引列表

### 1. 残疾类型分布统计 (`disabled_person`表)
- **字段**: `disability_type`
- **索引类型**: B树索引
- **理由**: 用于`GROUP BY disability_type`分组统计
- **SQL**:
```sql
CREATE INDEX idx_disabled_person_disability_type ON disabled_person(disability_type);
```

### 2. 性别分布统计 (`disabled_person`表)
- **字段**: `gender`
- **索引类型**: B树索引
- **理由**: 用于`GROUP BY gender`分组统计
- **SQL**:
```sql
CREATE INDEX idx_disabled_person_gender ON disabled_person(gender);
```

### 3. 年龄分布统计 (`disabled_person`表)
- **字段**: `birth_date`
- **索引类型**: B树索引
- **理由**: 用于年龄计算和分组，基于`birth_date`字段计算年龄
- **SQL**:
```sql
CREATE INDEX idx_disabled_person_birth_date ON disabled_person(birth_date);
```

### 4. 户籍分布统计 (`disabled_person`表)
- **字段**: `household_province`, `household_city`
- **索引类型**: 复合索引
- **理由**: 用于按省、市分组统计户籍分布
- **SQL**:
```sql
CREATE INDEX idx_disabled_person_household_location ON disabled_person(household_province, household_city);
```

### 5. 在职状态分布统计 (`disabled_person`表)
- **字段**: `job_status`
- **索引类型**: B树索引
- **理由**: 用于`GROUP BY job_status`分组统计
- **SQL**:
```sql
CREATE INDEX idx_disabled_person_job_status ON disabled_person(job_status);
```

### 6. 薪资分布统计 (`order_person`表)
- **字段**: `salary_detail`
- **索引类型**: B树索引
- **理由**: 用于薪资范围分组统计
- **SQL**:
```sql
CREATE INDEX idx_order_person_salary_detail ON order_person(salary_detail);
```

### 7. 视频类型统计 (`order_person_asset`表)
- **字段**: `asset_type`
- **索引类型**: B树索引
- **理由**: 用于按视频类型分组统计（打卡视频、薪资视频等）
- **SQL**:
```sql
CREATE INDEX idx_order_person_asset_asset_type ON order_person_asset(asset_type);
```

### 8. 企业数据关联索引
#### 8.1 `employment_order`表
- **字段**: `company_id`
- **索引类型**: B树索引
- **理由**: 用于企业数据隔离过滤
- **SQL**:
```sql
CREATE INDEX idx_employment_order_company_id ON employment_order(company_id);
```

#### 8.2 `order_person`表
- **字段**: `order_id`, `disabled_person_id`
- **索引类型**: 复合索引
- **理由**: 用于关联查询和统计
- **SQL**:
```sql
CREATE INDEX idx_order_person_association ON order_person(order_id, disabled_person_id);
```

#### 8.3 `order_person_asset`表
- **字段**: `order_person_id`
- **索引类型**: B树索引
- **理由**: 用于关联订单人员资产
- **SQL**:
```sql
CREATE INDEX idx_order_person_asset_order_person_id ON order_person_asset(order_person_id);
```

### 9. 复合索引优化（用于复杂统计查询）
#### 9.1 企业维度残疾人统计
- **表**: `disabled_person`通过`order_person`关联`employment_order`
- **字段**: `company_id` + 统计字段
- **理由**: 优化企业维度的复合统计查询
- **建议**: 考虑物化视图或覆盖索引

## 性能优化建议

### 1. 查询优化策略
- 使用CTE（Common Table Expressions）优化复杂年龄分组查询
- 对于大数据量统计，考虑定期生成物化视图
- 实现查询结果缓存机制，特别是对于变化不频繁的统计结果

### 2. 监控与调优
- 监控慢查询日志，识别性能瓶颈
- 定期分析索引使用情况，移除未使用的索引
- 考虑分区表策略，按时间或企业ID分区

### 3. 应用层优化
- 实现分页和增量统计，避免一次性加载大量数据
- 添加查询超时和取消机制
- 对高频统计接口实施限流和缓存

## 实施优先级

### 高优先级（直接影响核心功能）
1. `disabled_person.disability_type`索引
2. `disabled_person.gender`索引
3. `employment_order.company_id`索引（企业数据隔离）
4. `order_person.salary_detail`索引

### 中优先级（提升查询性能）
1. `disabled_person.birth_date`索引
2. `disabled_person.household_province, household_city`复合索引
3. `order_person_asset.asset_type`索引

### 低优先级（优化关联查询）
1. `order_person.order_id, disabled_person_id`复合索引
2. `order_person_asset.order_person_id`索引

## 注意事项
1. 在生产环境添加索引时，建议在低峰期进行
2. 索引会增加写操作的开销，需权衡读写比例
3. 定期维护索引（重建、重新统计）
4. 测试环境先行验证索引效果

## 监控指标
- 统计查询平均响应时间
- 数据库CPU和内存使用率
- 索引命中率
- 慢查询数量

---

*本文件为数据库索引优化建议，具体实施需根据实际数据库性能和业务需求调整。*