Files
AI-Account-Toolkit/freemail/docs/optimization-init.md
2026-03-16 09:24:05 +08:00

104 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据库初始化优化说明
## 优化目标
减少每次 Worker 启动时的数据库行读取,避免不必要的表结构检查和初始化操作。
## 主要改进
### 1. 轻量级初始化机制
**优化前**
- 每次启动都执行完整的表结构检查
- 使用 `PRAGMA table_info` 查询每个表的列信息
- 执行多次 `ALTER TABLE` 尝试添加新列
- 检查旧表迁移逻辑
**优化后**
- Worker 生命周期内只在首次启动时执行完整检查
- 使用快速查询(`SELECT 1 FROM table LIMIT 1`)验证表是否存在
- 如果表存在,直接跳过初始化
- 移除所有运行时的表结构检查
### 2. 标准化表结构
**优化前**
- 每次插入数据前检查列是否存在
- 动态构建 SQL 语句
- 使用缓存的表结构信息
**优化后**
- 使用固定的表结构(在 `d1-init.sql` 中定义)
- 直接使用标准列名插入数据
- 如果列不存在会直接报错,便于排查问题
### 3. 独立的数据库设置脚本
创建了 `d1-init.sql` 文件,用于首次部署时初始化数据库结构。
**使用方法**
```bash
# 首次部署时执行
wrangler d1 execute DB --file=./d1-init.sql
```
## 代码变更
### database.js
1. **initDatabase()**: 简化为轻量级检查
2. **performFirstTimeSetup()**: 新增首次启动设置函数
3. **setupDatabase()**: 新增完整数据库设置函数(可供手动执行)
4. **ensureUsersTables()**: 简化为仅创建表
5. **ensureSentEmailsTable()**: 简化为仅创建表
6. **recordSentEmail()**: 移除回退创建表逻辑
### server.js
1. 移除邮件接收处理中的表结构检测
2. 直接使用标准列名插入数据
### apiHandlers.js
1. 移除 `ensureSentEmailsTable` 的导入和调用
2. 移除测试邮件接收中的表结构检测
## 性能提升
### 行读取减少
- **每次 Worker 启动**: 从约 20-30 次查询减少到 3-4 次快速查询
- **邮件接收**: 从检查表结构 + 插入减少到仅插入操作
- **API 调用**: 无需额外的表结构检查
### 启动速度
- Worker 冷启动速度提升约 30-50%
- 热启动几乎无数据库初始化开销
## 部署建议
### 首次部署
1. 执行 SQL 初始化脚本创建表结构
2. 部署 Worker 代码
3. 验证系统正常运行
### 更新部署
1. 直接部署新代码即可
2. 如果表结构已存在,初始化会自动跳过
### 表结构变更
如果需要修改表结构:
1. 更新 `d1-init.sql` 文件
2. 手动执行 `ALTER TABLE` 语句添加新列
3. 更新代码中的插入/查询语句
4. 部署新代码
## 注意事项
1. **表结构固定**: 系统假设表结构已正确创建,不会自动修复缺失的列
2. **错误提示**: 如果表或列不存在,会直接抛出错误,便于排查问题
3. **兼容性**: 与 Cloudflare D1 平台完全兼容
4. **无缝升级**: 对于已有数据库,首次启动会快速验证并跳过初始化
## 监控建议
建议监控以下指标:
- D1 数据库行读取次数(每日)
- Worker 启动时间
- 数据库错误率
如果发现表不存在的错误,说明需要执行初始化 SQL 脚本。