Linux上MongoDB索引优化策略
一 索引设计原则
db.users.createIndex({username:1, email:1})。{email:1}, {unique:true};可选 {sparse:true})。二 查询与索引匹配方法
explain("executionStats") 验证是否命中索引、是否发生 COLLSCAN、扫描与返回数量是否接近,以及是否出现内存排序(stage 含 SORT/MERGE_SORT)。示例:db.orders.find({status:"A", amount:{$gt:100}}).sort({ts:-1}).explain("executionStats")。hint(),但应谨慎评估,避免人为误导优化器。三 维护与监控
db.collection.getIndexes() 列出索引,删除不再使用或冗余的索引;结合慢查询日志/Profiler 定位需优化的语句。db.collection.reIndex()(注意会锁表,生产谨慎)。db.collection.totalIndexSize() 评估索引体量,确保索引能常驻内存;在 Linux 上配合 SSD 与合理的 WiredTiger 缓存配置,降低 I/O 瓶颈。四 常见场景与索引建议
| 场景 | 推荐索引 | 说明 |
|---|---|---|
| 精确匹配单字段 | {field: 1} |
简单高效,避免 COLLSCAN |
| 多条件 + 排序 | {sortKey: 1, queryCriteria: 1} |
将排序字段置于前导,避免内存排序 |
| 范围查询 + 排序 | {rangeField: 1, sortField: 1} |
范围置于后位,索引可直接顺序扫描 |
| 高选择性过滤 + 低选择性字段 | {highSel: 1, lowSel: 1} |
低选择性字段放后,提升复合索引效率 |
| 全文搜索 | {$**text**: 1} |
替代低效正则,支持文本检索 |
| TTL 过期 | {createdAt: 1} + expireAfterSeconds |
自动清理过期数据,减少手工维护 |
五 配置与硬件要点
/etc/mongod.conf 中合理设置 WiredTiger cacheSizeGB,避免与系统和其他进程争用内存。