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

3.1 KiB
Raw Blame History

数据库初始化优化说明

优化目标

减少每次 Worker 启动时的数据库行读取,避免不必要的表结构检查和初始化操作。

主要改进

1. 轻量级初始化机制

优化前

  • 每次启动都执行完整的表结构检查
  • 使用 PRAGMA table_info 查询每个表的列信息
  • 执行多次 ALTER TABLE 尝试添加新列
  • 检查旧表迁移逻辑

优化后

  • Worker 生命周期内只在首次启动时执行完整检查
  • 使用快速查询(SELECT 1 FROM table LIMIT 1)验证表是否存在
  • 如果表存在,直接跳过初始化
  • 移除所有运行时的表结构检查

2. 标准化表结构

优化前

  • 每次插入数据前检查列是否存在
  • 动态构建 SQL 语句
  • 使用缓存的表结构信息

优化后

  • 使用固定的表结构(在 d1-init.sql 中定义)
  • 直接使用标准列名插入数据
  • 如果列不存在会直接报错,便于排查问题

3. 独立的数据库设置脚本

创建了 d1-init.sql 文件,用于首次部署时初始化数据库结构。

使用方法

# 首次部署时执行
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 脚本。