索引管理

创建索引

db.collection.createIndex(
  {"字段": 1},
  {
    background: true,
    name: "自定义索引名称",
    unique: false
  }
)

获取索引

db.collection.getIndexes()

查看索引大小

db.collection.totalIndexSize()

删除索引

db.collection.dropIndex("INDEX-NAME")

explain 分析

三种模式

  1. queryPlanner 模式 (默认):返回查询优化器选择的获胜计划
  2. executionStats 模式:提供实际的执行统计信息
  3. allPlansExecution 模式:最详细的执行计划分析

executionStats 核心指标

executionTimeMillis

  • 整个查询语句的完整执行时间

文档与索引扫描数量

  • nReturned:查询实际返回的文档数量
  • totalKeysExamined:扫描的索引条目数量
  • totalDocsExamined:扫描的完整文档数量

理想状态:nReturned = totalKeysExamined = totalDocsExamined

Stage 状态分析

希望看到的 Stage

  • IDHACK:直接使用 _id 字段查询
  • IXSCAN:使用索引扫描
  • FETCH:根据索引指针获取完整文档

不希望看到的 Stage

  • COLLSCAN:全表扫描
  • SORT:未使用索引的内存排序

性能优化建议

  1. 为查询条件创建合适的索引
  2. 复合索引需遵循最左前缀原则
  3. 使用覆盖查询避免回表
  4. 确保排序字段已建立索引