4.5 KiB
4.5 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 });
// TTL索引 - 自动清理过期记录
db.jimeng_free_generation_results.createIndex({
"expires_at": 1
}, {
expireAfterSeconds: 0
});
// 复合索引
db.jimeng_free_generation_results.createIndex({
"server_id": 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({ "expires_at": 1 }, { expireAfterSeconds: 0 });
db.jimeng_free_generation_results.createIndex({ "server_id": 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 索引:自动清理过期的结果记录,释放存储空间
- 时间索引:加速基于时间的查询和排序
这些索引的创建顺序不影响功能,但建议按照文档顺序执行以确保最佳性能。
注意事项
- 数据库名称:请根据实际使用的数据库名称调整脚本中的
jimeng-api - 连接地址:请根据实际的 MongoDB 连接地址调整命令
- 权限要求:执行索引创建需要数据库的写权限
- 生产环境:在生产环境中创建索引可能需要考虑对性能的影响,建议在低峰期执行