152 lines
5.0 KiB
Markdown
152 lines
5.0 KiB
Markdown
# MongoDB 索引创建指南
|
|
|
|
本项目使用 MongoDB 作为数据库,为了确保良好的查询性能,需要手动创建以下索引。
|
|
|
|
## 连接到 MongoDB
|
|
|
|
```bash
|
|
# 连接到 MongoDB
|
|
mongo mongodb://localhost:27017/jimeng-api
|
|
|
|
# 或者使用 MongoDB Compass 等图形工具
|
|
```
|
|
|
|
## 需要创建的索引
|
|
|
|
### 1. 生成任务表 (jimeng_free_generation_tasks)
|
|
|
|
```javascript
|
|
// 基础索引
|
|
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)
|
|
|
|
```javascript
|
|
// 基础索引
|
|
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)
|
|
|
|
```javascript
|
|
// 基础索引
|
|
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` 文件,然后执行:
|
|
|
|
```javascript
|
|
// 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("所有索引创建完成!");
|
|
```
|
|
|
|
执行命令:
|
|
```bash
|
|
mongo mongodb://localhost:27017/jimeng-api create_indexes.js
|
|
```
|
|
|
|
## 验证索引
|
|
|
|
创建完成后,可以验证索引是否正确创建:
|
|
|
|
```javascript
|
|
// 查看所有集合的索引
|
|
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. **生产环境**:在生产环境中创建索引可能需要考虑对性能的影响,建议在低峰期执行 |