# UPDATE 慢查询问题修复
## ❌ **问题现象**
导入100条数据需要很长时间,每条UPDATE需要1.5-1.6秒。
### **日志显示**
```
slow sql 1608 millis. update sys_user
slow sql 1577 millis. update sys_user
slow sql 1160 millis. update sys_user
```
**预期时间:** <100ms
**实际时间:** 1500ms+
**慢了15倍!**
---
## 🔍 **问题原因**
### **原因1:UPDATE SQL 字段重复设置(最严重)**
在 `SysUserMapper.xml` 的 `updateUser` 方法中,字段设置了**两次**:
```xml
prison_name = #{prisonName},
prison_area = #{prisonArea},
ethnicity = #{ethnicity},
education_level = #{educationLevel},
crime_name = #{crimeName},
sentence_term = #{sentenceTerm},
sentence_start_date = #{sentenceStartDate},
sentence_end_date = #{sentenceEndDate},
entry_date = #{entryDate},
student_status = #{studentStatus},
prison_name = #{prisonName,jdbcType=VARCHAR},
prison_area = #{prisonArea,jdbcType=VARCHAR},
ethnicity = #{ethnicity,jdbcType=VARCHAR},
education_level = #{educationLevel,jdbcType=VARCHAR},
crime_name = #{crimeName,jdbcType=VARCHAR},
sentence_term = #{sentenceTerm,jdbcType=INTEGER},
sentence_start_date = #{sentenceStartDate,jdbcType=DATE},
sentence_end_date = #{sentenceEndDate,jdbcType=DATE},
entry_date = #{entryDate,jdbcType=DATE},
student_status = #{studentStatus},
```
**结果:** 每个字段都被设置了两次,导致UPDATE执行缓慢!
---
### **原因2:数据库索引未创建**
执行 `optimize_import_performance_safe.sql` 添加索引,提升查询速度。
---
### **原因3:远程数据库延迟**
数据库在远程服务器 `101.35.101.159`,存在网络延迟。
---
## ✅ **解决方案**
### **修复1:删除重复字段(已完成)**
**文件:** `SysUserMapper.xml`
**修改:** 删除 351-360 行的重复字段设置
**修改前:**
```xml
student_status = #{studentStatus},
prison_name = #{prisonName,jdbcType=VARCHAR},
prison_area = #{prisonArea,jdbcType=VARCHAR},
student_status = #{studentStatus},
update_time = sysdate()
```
**修改后:**
```xml
student_status = #{studentStatus},
update_time = sysdate()
```
---
### **修复2:执行数据库优化SQL**
如果还没执行,请执行:
```sql
-- 文件:log/Sql/optimize_import_performance_safe.sql
-- 主要添加以下索引:
ALTER TABLE sys_user ADD INDEX idx_user_name (user_name);
ALTER TABLE sys_user ADD INDEX idx_nick_name (nick_name);
ALTER TABLE student_class ADD INDEX idx_student_id (student_id);
ALTER TABLE student_class ADD INDEX idx_student_status (student_id, status);
```
---
## 🚀 **部署步骤**
### **步骤1:重新编译**
```bash
cd C:\Users\Administrator\Desktop\Project\ry_study-v_03\Study-Vue-redis
mvn clean package -DskipTests
```
### **步骤2:重启服务**
停止旧服务,启动新服务
### **步骤3:执行数据库优化(如果还没执行)**
在 Navicat 中连接到数据库 `study`,执行:
```
log/Sql/optimize_import_performance_safe.sql
```
### **步骤4:测试导入**
1. 导入100条数据
2. 观察日志,查看UPDATE时间
3. 确认无 "slow sql" 警告
---
## 📊 **性能对比**
### **修复前**
| 指标 | 数值 |
|------|------|
| 每条UPDATE时间 | 1500ms+ |
| 100条总时间 | 2-3分钟 |
| 慢查询警告 | 每条都有 |
| SQL字段 | 重复设置 |
### **修复后(预期)**
| 指标 | 数值 |
|------|------|
| 每条UPDATE时间 | <100ms |
| 100条总时间 | 10-30秒 |
| 慢查询警告 | 无 |
| SQL字段 | 正常 |
**性能提升:15倍以上**
---
## 🧪 **验证方法**
### **测试1:查看SQL执行时间**
导入时查看日志,应该看到:
```
DEBUG c.d.s.m.S.updateUser - ==> Preparing: update sys_user SET ...
DEBUG c.d.s.m.S.updateUser - ==> Parameters: ...
DEBUG c.d.s.m.S.updateUser - <== Updates: 1
```
**不应该有** "slow sql" 警告!
---
### **测试2:导入速度测试**
```bash
# 导入100条数据
开始时间: 15:30:00
结束时间: 15:30:15
总耗时: 15秒 ✅
# 修复前需要 2-3 分钟
# 修复后只需 15-30 秒
```
---
### **测试3:验证SQL正确性**
在日志中查看UPDATE SQL,应该是:
```sql
update sys_user
SET dept_id = ?,
user_name = ?,
...
prison_name = ?, -- 只出现一次
prison_area = ?, -- 只出现一次
...
update_time = sysdate()
where user_id = ?
```
每个字段**只出现一次**!
---
## ⚠️ **注意事项**
### **1. 必须重新编译**
Mapper 文件修改后必须重新编译,否则不生效!
```bash
mvn clean package -DskipTests
```
### **2. 必须重启服务**
编译完成后必须重启服务,新的Mapper才会加载。
### **3. 数据库索引**
如果没有执行索引SQL,性能提升不明显。
建议执行 `optimize_import_performance_safe.sql`。
### **4. 远程数据库延迟**
即使优化后,远程数据库仍有网络延迟(约50-100ms/条)。
如果需要更快,考虑:
- 使用本地数据库测试
- 批量操作
- 异步处理
---
## 🔍 **问题根源分析**
### **为什么会有重复字段?**
可能的原因:
1. 代码合并时重复添加
2. 不同开发者添加相同字段
3. 复制粘贴时未删除旧代码
### **为什么慢?**
1. **重复字段:** 每个字段设置两次,数据库执行时间翻倍
2. **缺少索引:** 没有索引的查询需要全表扫描
3. **远程延迟:** 网络往返时间增加
---
## 💡 **优化建议**
### **1. 代码审查**
定期检查Mapper文件,避免重复字段:
```bash
# 查找重复的SET语句
grep -A 50 "