硬件是性能的基础,需根据业务需求选择合适的配置:
调整操作系统参数以减少资源竞争:
ufw disable)、禁用SELinux(setenforce 0),减少系统负载。echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled永久禁用。vm.swappiness设为10或更低(sysctl -w vm.swappiness=10),减少内存交换(Swap)对性能的影响。ntpdate ntp.aliyun.com)同步服务器时间,避免因时间差异导致的复制延迟。通过调整配置文件(/etc/mongod.conf)适配业务场景:
storage.wiredTiger.engineConfig.cacheSizeGB为系统内存的40%-60%(如cacheSizeGB: 4),避免缓存过大抢占内存或过小导致频繁磁盘I/O。net.compression.compressors(如zstd或snappy),减少网络传输量(云环境/跨机房推荐zstd,压缩率高;内网推荐snappy,CPU开销低)。storage.wiredTiger.engineConfig.directoryForIndexes: true,将索引文件与集合数据文件分离到不同目录,分散磁盘I/O压力(需在初始化实例时设置)。storage.wiredTiger.collectionConfig.blockCompressor(如zstd,压缩率最高;snappy,CPU开销最低),平衡存储空间与写性能。operationProfiling.mode: slowOp(慢查询阈值设为100ms),监控并优化慢查询。索引是提升查询性能的关键,需合理设计和管理:
find、sort、aggregate等操作的高频字段创建索引(如db.users.createIndex({username: 1}));复合索引需遵循最左前缀原则(如{field1: 1, field2: 1}可支持field1查询、field1+field2查询)。db.users.createIndex({username: 1, email: 1}),查询{username: 1, email: 1}可直接从索引获取数据,无需访问文档)。db.collection.reIndex()重建碎片化索引;通过db.collection.aggregate([{ $indexStats: {} }])分析索引使用情况,删除未使用的索引(减少写入开销)。优化查询语句以减少资源消耗:
projection参数只返回需要的字段(如db.users.find({}, {username: 1, email: 1, _id: 0})),减少数据传输量。limit()方法限制返回的文档数量(如db.users.find().limit(100)),避免一次性返回大量数据。explain()方法查看查询计划,确认是否使用了索引)。insertMany()、updateMany()等批量操作,减少网络往返次数(如db.users.insertMany([{name: 'Alice'}, {name: 'Bob'}]))。skip()分页(大数据量时性能差),改用_id范围分页(如db.users.find({_id: {$gt: lastId}}).limit(10))。合理设计数据模型以适应业务需求:
{user: 'Alice', orders: [{id: 1, amount: 100}, {id: 2, amount: 200}]}),减少lookup`操作(关联查询)的开销。padding),避免文档迁移(重新分配空间)导致的性能下降。ObjectId作为主键(默认),避免使用长字符串;数值类型选择int32/int64而非double(减少存储空间)。通过分片和副本集实现水平扩展和高可用:
readPreference: secondary将读取请求分发到从节点。user_id分片),提高写入和查询性能;选择合适的分片键(如高基数的字段,避免热点问题)。sh.status()),避免数据倾斜。持续监控性能以及时发现问题:
mongostat(监控QPS、延迟)、mongotop(监控集合级别的读写时间)实时查看性能指标。operationProfiling.mode: slowOp),定期分析慢查询日志(db.adminCommand({getLog: 'slow'})),优化慢查询语句。