索引管理
创建索引
db.collection.createIndex(
{"字段": 1},
{
background: true,
name: "自定义索引名称",
unique: false
}
)
获取索引
db.collection.getIndexes()
查看索引大小
db.collection.totalIndexSize()
删除索引
db.collection.dropIndex("INDEX-NAME")
explain 分析
三种模式
- queryPlanner 模式 (默认):返回查询优化器选择的获胜计划
- executionStats 模式:提供实际的执行统计信息
- allPlansExecution 模式:最详细的执行计划分析
executionStats 核心指标
executionTimeMillis
- 整个查询语句的完整执行时间
文档与索引扫描数量
- nReturned:查询实际返回的文档数量
- totalKeysExamined:扫描的索引条目数量
- totalDocsExamined:扫描的完整文档数量
理想状态:nReturned = totalKeysExamined = totalDocsExamined
Stage 状态分析
希望看到的 Stage:
- IDHACK:直接使用 _id 字段查询
- IXSCAN:使用索引扫描
- FETCH:根据索引指针获取完整文档
不希望看到的 Stage:
- COLLSCAN:全表扫描
- SORT:未使用索引的内存排序
性能优化建议
- 为查询条件创建合适的索引
- 复合索引需遵循最左前缀原则
- 使用覆盖查询避免回表
- 确保排序字段已建立索引