CentOS环境下MongoDB文档查询优化技巧
硬件是查询性能的基础,需根据业务负载调整配置:
storage.wiredTiger.engineConfig.cacheSizeGB参数设置,通常为物理内存的50%-70%),减少磁盘I/O。索引是提升查询速度的关键,需合理设计和管理:
find()、sort()、update()等操作的高频字段创建索引(如db.collection.createIndex({ field: 1 }))。优先为选择性高的字段(如唯一ID、状态字段)创建索引,过滤效果更明显。{ field1: value1, field2: value2 }),创建复合索引(如db.collection.createIndex({ field1: 1, field2: 1 }))。字段顺序需与查询条件顺序一致,且将筛选性强的字段放在前面(如status: 1, createTime: -1)。db.collection.find({ field1: value }, { field1: 1, _id: 0 })),可避免访问文档本身,大幅提升性能。db.collection.getIndexes()查看现有索引,删除未使用的冗余索引。db.collection.reIndex()重建碎片化索引,保持索引效率;使用hint()强制查询使用特定索引(如db.collection.find(query).hint({ field: 1 })),但需谨慎避免人为错误。优化查询语句可减少不必要的资源消耗:
find()的第二个参数指定返回字段(如db.collection.find({ query }, { field1: 1, field2: 1, _id: 0 })),减少网络传输和内存占用。skip()+limit()(如db.collection.find().skip(1000).limit(10)),因skip()会扫描大量文档。推荐用**_id分页**(记录上一页最后一条文档的_id,下次查询{ _id: { $gt: lastId } }),效率更高。explain("executionStats")分析执行计划,查看winningPlan是否使用索引)。避免使用$or(除非所有条件都有索引)、$where(JavaScript执行慢)、$regex(模糊匹配,除非用^开头表示前缀匹配)。insertMany()替代逐条insertOne(),减少网络往返次数;写入时根据需求调整writeConcern(如{ w: 1 }表示确认写入主节点,平衡性能与可靠性)。调整MongoDB配置以适应业务需求:
/etc/mongod.conf中修改storage.wiredTiger.engineConfig.cacheSizeGB(如cacheSizeGB: 4),根据服务器内存大小调整(建议不超过物理内存的70%)。operationProfiling.mode: "slowOp"(记录慢查询),operationProfiling.slowOpThresholdMs: 100(慢查询阈值,单位毫秒),通过db.setProfilingLevel(1, 100)实时开启,分析慢查询并优化。net.maxIncomingConnections(如maxIncomingConnections: 5000),避免连接过多导致资源耗尽。replication.replSetName)提高读取性能,将读请求分发到从节点(通过readPreference: "secondary"设置),减轻主节点压力;同时提升数据冗余和可用性。sharding.clusterRole)水平扩展。选择合适的分片键(如user_id、order_id等高频查询字段),避免数据倾斜(如避免用timestamp作为分片键,可能导致某些分片过大)。持续监控性能以发现瓶颈:
mongostat(查看每秒操作数、读写延迟)、mongotop(查看集合级读写时间)监控实时性能;通过explain("executionStats")分析查询执行计划(关注executionTimeMillis、totalDocsExamined等指标)。合理的数据模型设计可减少查询复杂度:
{ user_id: 1, name: "Alice", orders: [{ order_id: 101, amount: 100 }, ...] }),避免lookup JOIN操作,提升查询效率。{ user_id: 1, log_id: 101 },日志存储在另一个集合)减少开销。active_users单独建集合,冷数据归档到archive_users),提升查询针对性。