1. 连接到MongoDB实例
在CentOS服务器上,使用mongo命令连接到本地MongoDB实例(若为远程实例,需替换为对应IP和端口):
mongo 连接成功后,切换至目标数据库(如myDatabase):
use myDatabase 2. 分析查询模式(定位需索引字段)
使用explain()方法分析慢查询的执行计划,重点关注executionStats中的totalDocsExamined(扫描文档数)、keysExamined(扫描索引键数)和winningPlan(执行的索引策略)。例如,分析users集合中username字段的查询:
db.users.find({ username: "Alice" }).explain("executionStats") 若totalDocsExamined远大于nReturned(返回文档数),说明需为username字段创建索引。
3. 创建合适的索引
username):db.users.createIndex({ username: 1 }) // 1表示升序,-1表示降序 username和email时:db.users.createIndex({ username: 1, email: 1 }) explain()确认totalDocsExamined: 0)。例如,若查询只需username和status字段:db.users.createIndex({ username: 1, status: 1 }, { projection: { _id: 0, username: 1, status: 1 } }) status: "active"的用户):db.users.createIndex({ username: 1 }, { partialFilterExpression: { status: "active" } }) 4. 删除冗余或无用索引
getIndexes()方法列出集合的所有索引(包括_id索引):db.users.getIndexes() email索引),减少写入开销和存储占用:db.users.dropIndex("username_1_email_1") // 索引名称可通过getIndexes()获取 5. 强制使用索引(谨慎使用)
若查询优化器未选择最优索引,可使用hint()方法强制指定索引(如强制使用username索引):
db.users.find({ username: "Alice" }).hint({ username: 1 }) 注意:仅在确认优化器选择错误时使用,避免人为干预导致性能下降。
6. 定期重建索引(优化碎片)
随着数据增删改,索引会产生碎片,导致查询性能下降。使用reIndex()方法重建集合索引(需在低流量时段执行,避免影响业务):
db.users.reIndex() 对于整个数据库,可使用repairDatabase()命令(需停机,且需足够磁盘空间):
use admin db.runCommand({ repairDatabase: 1 }) 7. 监控索引使用情况
db.setProfilingLevel(2, { slowms: 100 }) // 2表示记录所有操作,slowms表示慢查询阈值 查看慢查询日志:db.system.profile.find().sort({ ts: -1 }).limit(10) 8. 硬件与配置优化(辅助提升性能)
wiredTigerCacheSizeGB参数(默认为物理内存的50%)足够大,以缓存索引和热点数据(如设置为服务器内存的70%)。修改/etc/mongod.conf文件:storage: wiredTiger: engineConfig: cacheSizeGB: 8 # 根据服务器内存调整 重启MongoDB生效:sudo systemctl restart mongod /var/lib/mongo)部署在SSD上,提升I/O性能(比HDD快3-5倍)。注意事项
mongodump备份集合,避免误操作导致数据丢失。