如何提升Linux上MongoDB的读写速度
mongod.conf中的storage.wiredTiger.engineConfig.cacheSizeGB参数,设置为系统内存的40%-60%(预留部分给操作系统和其它进程)。例如,8GB内存的服务器可设置为3-5GB,避免缓存过大导致内存溢出。mongod.conf的net模块中设置compression.compressors为zstd(推荐,压缩率高且CPU开销低)或snappy(低延迟,适合写密集型场景)。压缩能减少网络传输数据量,降低跨机房或云环境的延迟,尤其适合副本集同步或应用服务器与MongoDB之间的通信。mongod.conf的storage.wiredTiger.engineConfig中设置directoryForIndexes: true,将索引文件与集合数据文件分别存放在不同目录(如/data/db/collection和/data/db/index)。若服务器有多个物理磁盘,可将索引目录挂载到SSD,数据目录挂载到HDD,分散I/O压力,提升索引查询性能。ulimit -n命令将文件描述符限制提高到65535及以上,并在/etc/security/limits.conf中永久设置,避免因文件描述符不足导致连接拒绝。find、sort、aggregate操作的字段创建索引(如db.collection.createIndex({ "user_id": 1 }))。复合索引(如db.collection.createIndex({ "user_id": 1, "create_time": -1 }))能支持多条件查询,提高查询效率。{ "user_id": 1, "name": 1 },查询db.collection.find({ "user_id": 1 }, { "name": 1 })),避免访问磁盘上的文档,减少I/O开销。db.collection.reIndex()命令重建碎片化索引(如数据频繁删除/更新后),提升索引查询效率;通过db.collection.aggregate([{ $indexStats: {} }])监控索引使用情况,删除未使用的索引(如db.collection.dropIndex("index_name")),减少写操作的开销。$where(JavaScript执行慢)、$all(全数组匹配)等低效操作符;尽量使用$eq、$in等高效操作符,减少查询时间。projection参数仅返回需要的字段(如db.collection.find({}, { "name": 1, "age": 1 })),减少数据传输量;通过limit参数限制返回结果数量(如db.collection.find().limit(10)),避免处理过多数据。explain("executionStats")分析查询执行计划,确保查询条件能利用索引(winningPlan.inputStage.stage为IXSCAN,表示使用了索引)。若出现COLLSCAN(全表扫描),需调整索引或查询条件。user_id、order_id),避免数据倾斜(如某个分片数据量远大于其他分片)。mongostat(监控每秒的读写次数、延迟等指标)、mongotop(监控集合级别的读写时间分布)实时监控MongoDB性能,快速定位瓶颈。operationProfiling.slowOpThresholdMs: 100,单位毫秒),通过db.profile.find()查看慢查询详情,针对性优化索引或查询语句。