Ubuntu上优化MongoDB查询性能
一 硬件与操作系统层优化
/sys/kernel/mm/transparent_hugepage/enabled与defrag设为never,并启用该服务。/etc/security/limits.d/mongodb.conf设置nofile、nproc),防止连接、句柄耗尽。二 存储引擎与内存配置
/etc/mongod.conf中配置storage.wiredTiger.engineConfig.cacheSizeGB,通常将可用内存的**70%–80%**分配给缓存(需结合实例上其他服务与系统开销综合评估,避免OOM)。net.maxIncomingConnections等参数需与业务并发、ulimit及驱动连接池匹配,避免连接风暴与排队。三 索引设计与查询优化
db.coll.createIndex({field: 1}){a:1, b:1, c:-1}可优化a=1且按b升序、c降序的查询。{desc: "text"}用于关键词检索。_id,需显式排除或加入索引。explain("executionStats")查看totalDocsExamined、totalKeysExamined、nReturned,目标是降低扫描量并提升命中率。COLLSCAN(全表扫描)与IXSCAN但keysExamined过大等信号,优先补齐或重构索引。{a:1, b:-1})。skip/limit,改用基于游标的分页(记录上一页的排序键/时间戳)。$or子句分别建立索引。hint()固定索引用于验证或特殊场景。四 监控、诊断与维护
mongostat、mongotop观察吞吐、锁、页错误与热点集合/操作。slowOpThresholdMs(如100ms)记录慢操作;必要时开启operationProfiling或将日志级别临时调高以定位问题。/var/log/mongodb/mongod.log中检索COMMAND与执行时间,或使用logRotate轮转日志便于离线分析。db.collection.getIndexes()与执行计划检查索引命中与覆盖情况。reIndex()或使用compact收缩与整理碎片(注意锁与窗口期)。五 快速检查清单与示例
cacheSizeGB设置合理且系统无OOM。mongostat/mongotop常态化监控。db.orders.createIndex({ customer_id: 1, order_date: -1 })db.orders.find({ customer_id: 123, status: "paid" }, { customer_id: 1, order_date: 1, _id: 0 }).explain("executionStats")db.setProfilingLevel(1, { slowms: 100 })tail -f /var/log/mongodb/mongod.log | grep "COMMAND"db.posts.find({status:"published"}).sort({ts:-1}).limit(20)db.posts.find({status:"published", ts:{$lt: lastSeenTs}}).sort({ts:-1}).limit(20)