优化日期: 2025-12-05
版本: v2.1
优化目标: 减少数据库空间占用80%
| 配置 | 值 |
|---|---|
| base64阈值 | 2MB |
| 文件大小限制 | 无 |
| 监控日志 | 无 |
数据库空间占用(每天50张图片):
| 配置 | 值 |
|---|---|
| base64阈值 | 0.5MB ✅ |
| 文件大小限制 | 10MB ✅ |
| 监控日志 | 完善 ✅ |
数据库空间占用(每天50张图片):
代码位置: src/modules/project/services/project-file.service.ts:401
// 修改前
const USE_BASE64_THRESHOLD = 2; // MB
// 修改后
const USE_BASE64_THRESHOLD = 0.5; // MB ✅ 降低到0.5MB
效果:
代码位置: src/modules/project/services/project-file.service.ts:387-391
// 新增代码
const MAX_FILE_SIZE_MB = 10;
if (fileSizeMB > MAX_FILE_SIZE_MB) {
throw new Error(`文件过大,请上传小于${MAX_FILE_SIZE_MB}MB的文件`);
}
效果:
代码位置: src/modules/project/services/project-file.service.ts:427,454,478-482
console.log(`📊 [监控] base64存储: ${file.name}, 大小: ${fileSizeMB.toFixed(2)}MB, 数据库占用: ${(fileSizeMB * 1.33).toFixed(2)}MB`);
console.log(`📊 [监控] 云存储成功: ${file.name}, 大小: ${fileSizeMB.toFixed(2)}MB, 数据库占用: ~100字节`);
console.warn(`🚨 [告警] 大文件降级base64: ${file.name}, 大小: ${fileSizeMB.toFixed(2)}MB, 数据库占用: ${dbSize.toFixed(2)}MB`);
if (fileSizeMB > 3) {
console.error(`🔴 [严重告警] 超大文件(${fileSizeMB.toFixed(2)}MB)使用base64,可能导致数据库空间问题!`);
}
效果:
小图 < 2MB: 30张 × 1.5MB × 1.33 = 60MB
大图成功: 16张 × URL = 1.6KB
大图失败: 4张 × 5MB × 1.33 = 26.6MB
─────────────────────────────────
每天: 86.6MB
每月: 2.6GB
每年: 31.2GB
极小图 < 0.5MB: 10张 × 0.3MB × 1.33 = 4MB
中大图成功: 32张 × URL = 3.2KB
中大图失败: 8张 × 4MB × 1.33 = 42.6MB (降级)
─────────────────────────────────
每天: 46.6MB
每月: 1.4GB ✅ (降低46%)
每年: 16.8GB ✅ (降低46%)
每天: 346MB
每月: 10.4GB ⚠️
每年: 125GB ❌ 风险极高
每天: 186MB
每月: 5.6GB ✅
每年: 67GB ✅ (降低46%)
📊 [监控] base64存储: small.jpg, 大小: 0.3MB, 数据库占用: 0.4MB
📊 [监控] 云存储成功: large.jpg, 大小: 5.2MB, 数据库占用: ~100字节
🚨 [告警] 大文件降级base64: image.jpg, 大小: 2.5MB, 数据库占用: 3.3MB
🔴 [严重告警] 超大文件(5.2MB)使用base64,可能导致数据库空间问题!
处理方式:
[ ] 小图片(< 0.5MB)
预期日志:
🔄 文件较小(0.3MB),使用base64直接存储
✅ 小文件base64存储成功
📊 [监控] base64存储: xxx, 数据库占用: 0.4MB
[ ] 中等图片(1-3MB)
预期日志:
⚡ 文件较大(2.5MB),优先使用NovaStorage
✅ 大文件NovaStorage上传成功
📊 [监控] 云存储成功: xxx, 数据库占用: ~100字节
[ ] 大图片(5-10MB)
预期日志:
⚡ 文件较大(8.5MB),优先使用NovaStorage
✅ 大文件NovaStorage上传成功
📊 [监控] 云存储成功: xxx, 数据库占用: ~100字节
[ ] 超大图片(> 10MB)
预期错误:
❌ 文件过大,请上传小于10MB的文件。当前文件: 12.5MB
[ ] NovaStorage失败场景
预期日志:
⚡ 文件较大(5.2MB),优先使用NovaStorage
⚠️ NovaStorage上传失败(631),降级到base64存储
✅ 大文件降级base64存储成功
🚨 [告警] 大文件降级base64: xxx, 数据库占用: 6.9MB
🔴 [严重告警] 超大文件使用base64...
记录一周的上传数据:
| 指标 | 数值 | 备注 |
|---|---|---|
| 总上传文件数 | ? | |
| 使用base64数量 | ? | 应该很少 |
| 使用云存储数量 | ? | 应该占大多数 |
| 降级base64数量 | ? | 如果很多,需检查NovaStorage |
| 数据库增长 | ? GB | 应该远低于优化前 |
| NovaStorage成功率 | ?% | 应该 > 80% |
| 指标 | 优秀 | 良好 | 需优化 |
|---|---|---|---|
| base64占比 | < 15% | 15-30% | > 30% |
| 云存储成功率 | > 90% | 80-90% | < 80% |
| 数据库周增长 | < 200MB | 200-500MB | > 500MB |
// 可以进一步降低阈值
const USE_BASE64_THRESHOLD = 0.2; // 200KB
// 或者完全禁用base64
const USE_BASE64_THRESHOLD = 0; // 全部走云存储
优化完成!请立即测试验证。 🚀