jimeng-free-api/MONGODB_INDEXES.md
2025-08-27 19:10:52 +08:00

5.0 KiB

MongoDB 索引创建指南

本项目使用 MongoDB 作为数据库,为了确保良好的查询性能,需要手动创建以下索引。

连接到 MongoDB

# 连接到 MongoDB
mongo mongodb://localhost:27017/jimeng-api

# 或者使用 MongoDB Compass 等图形工具

需要创建的索引

1. 生成任务表 (jimeng_free_generation_tasks)

// 基础索引
db.jimeng_free_generation_tasks.createIndex({ "task_id": 1 }, { unique: true });
db.jimeng_free_generation_tasks.createIndex({ "server_id": 1 });
db.jimeng_free_generation_tasks.createIndex({ "status": 1 });
db.jimeng_free_generation_tasks.createIndex({ "created_at": 1 });
db.jimeng_free_generation_tasks.createIndex({ "next_poll_at": 1 });

// 复合索引 - 用于轮询查询优化
db.jimeng_free_generation_tasks.createIndex({ 
    "server_id": 1, 
    "status": 1, 
    "next_poll_at": 1 
});

// 复合索引 - 用于服务器负载查询
db.jimeng_free_generation_tasks.createIndex({ 
    "server_id": 1, 
    "created_at": 1 
});

2. 生成结果表 (jimeng_free_generation_results)

// 基础索引
db.jimeng_free_generation_results.createIndex({ "task_id": 1 }, { unique: true });
db.jimeng_free_generation_results.createIndex({ "server_id": 1 });
db.jimeng_free_generation_results.createIndex({ "created_at": 1 });
db.jimeng_free_generation_results.createIndex({ "is_read": 1 });
db.jimeng_free_generation_results.createIndex({ "first_read_at": 1 });

// TTL索引 - 自动清理过期记录
db.jimeng_free_generation_results.createIndex({ 
    "expires_at": 1 
}, { 
    expireAfterSeconds: 0 
});

// 复合索引
db.jimeng_free_generation_results.createIndex({ 
    "server_id": 1, 
    "created_at": 1 
});

// 复合索引 - 用于查询已读取/未读取的结果
db.jimeng_free_generation_results.createIndex({ 
    "is_read": 1, 
    "created_at": 1 
});

3. 服务器心跳表 (jimeng_servers)

// 基础索引
db.jimeng_servers.createIndex({ "server_id": 1 }, { unique: true });
db.jimeng_servers.createIndex({ "last_heartbeat": 1 });

// 复合索引 - 用于查询在线服务器
db.jimeng_servers.createIndex({ 
    "is_active": 1, 
    "last_heartbeat": 1 
});

一键执行脚本

将以下内容保存为 create_indexes.js 文件,然后执行:

// create_indexes.js
print("开始创建 jimeng-free-api 数据库索引...");

// 生成任务表索引
db = db.getSiblingDB('jimeng-api');

print("创建生成任务表索引...");
db.jimeng_free_generation_tasks.createIndex({ "task_id": 1 }, { unique: true });
db.jimeng_free_generation_tasks.createIndex({ "server_id": 1 });
db.jimeng_free_generation_tasks.createIndex({ "status": 1 });
db.jimeng_free_generation_tasks.createIndex({ "created_at": 1 });
db.jimeng_free_generation_tasks.createIndex({ "next_poll_at": 1 });
db.jimeng_free_generation_tasks.createIndex({ "server_id": 1, "status": 1, "next_poll_at": 1 });
db.jimeng_free_generation_tasks.createIndex({ "server_id": 1, "created_at": 1 });

print("创建生成结果表索引...");
db.jimeng_free_generation_results.createIndex({ "task_id": 1 }, { unique: true });
db.jimeng_free_generation_results.createIndex({ "server_id": 1 });
db.jimeng_free_generation_results.createIndex({ "created_at": 1 });
db.jimeng_free_generation_results.createIndex({ "is_read": 1 });
db.jimeng_free_generation_results.createIndex({ "first_read_at": 1 });
db.jimeng_free_generation_results.createIndex({ "expires_at": 1 }, { expireAfterSeconds: 0 });
db.jimeng_free_generation_results.createIndex({ "server_id": 1, "created_at": 1 });
db.jimeng_free_generation_results.createIndex({ "is_read": 1, "created_at": 1 });

print("创建服务器心跳表索引...");
db.jimeng_servers.createIndex({ "server_id": 1 }, { unique: true });
db.jimeng_servers.createIndex({ "last_heartbeat": 1 });
db.jimeng_servers.createIndex({ "is_active": 1, "last_heartbeat": 1 });

print("所有索引创建完成!");

执行命令:

mongo mongodb://localhost:27017/jimeng-api create_indexes.js

验证索引

创建完成后,可以验证索引是否正确创建:

// 查看所有集合的索引
db.jimeng_free_generation_tasks.getIndexes();
db.jimeng_free_generation_results.getIndexes();
db.jimeng_servers.getIndexes();

性能说明

  • 唯一索引:确保 task_id 和 server_id 的唯一性
  • 复合索引:优化多字段查询,特别是轮询任务时的复杂查询
  • TTL 索引:自动清理过期的结果记录,释放存储空间
  • 时间索引:加速基于时间的查询和排序

这些索引的创建顺序不影响功能,但建议按照文档顺序执行以确保最佳性能。

注意事项

  1. 数据库名称:请根据实际使用的数据库名称调整脚本中的 jimeng-api
  2. 连接地址:请根据实际的 MongoDB 连接地址调整命令
  3. 权限要求:执行索引创建需要数据库的写权限
  4. 生产环境:在生产环境中创建索引可能需要考虑对性能的影响,建议在低峰期执行