WiredTiger
引擎有足够空间缓存热点数据。ufw
)、禁用SELinux(若启用),减少系统负载。XFS
文件系统(推荐)或ext4
,两者均对MongoDB的高并发读写有良好支持;避免使用FAT32
或NTFS
。/etc/fstab
中为数据库分区添加noatime
参数,减少文件访问时间的更新开销。编辑/etc/mongod.conf
文件(需root权限),重点优化以下参数:
storage:
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 设置为物理内存的50%-70%(如16GB内存设为8GB)
cacheSizeGB
决定WiredTiger缓存大小,合理配置可减少磁盘I/O。net:
maxIncomingConnections: 1000 # 根据并发连接数调整(默认10000,可根据需求减小)
避免过多连接导致资源耗尽。operationProfiling:
mode: slowOp # 监控慢查询
slowOpThresholdMs: 100 # 定义慢查询阈值为100ms
通过此配置可快速定位性能瓶颈查询。systemLog:
verbosity: 2 # 记录详细日志(生产环境建议设为1,避免日志过大)
便于后续分析性能问题。oplogSizeMB
(操作日志大小,默认5%磁盘空间):replication:
oplogSizeMB: 1024 # 根据数据变更频率调整(如高频写入设为2048MB)
较大的oplog
可避免主节点故障时副本集同步失败。db.users.createIndex({ "email": 1 }); // 为email字段创建升序索引
db.orders.createIndex({ "user_id": 1, "order_date": -1 }); // 复合索引(支持多条件查询)
索引能将查询时间从O(n)降低到O(log n)。db.users.dropIndex("email_1"); // 删除指定索引
db.users.find({ "age": { "$gt": 18 } }, { "name": 1, "age": 1, "_id": 0 }).explain("executionStats");
查看executionStats
中的isMultiKey
、indexOnly
字段,若indexOnly
为true
则表示使用了覆盖索引。使用explain()
方法查看查询执行计划,识别慢查询:
db.products.find({ "category": "electronics", "price": { "$lt": 1000 } }).explain("executionStats");
重点关注executionTimeMillis
(执行时间)、winningPlan
(执行计划)、usedIndexes
(使用的索引)。
limit()
减少数据传输量:db.users.find().limit(10); // 只返回前10条记录
db.users.find({ "age": { "$gt": 18 } }, { "name": 1, "age": 1, "_id": 0 }); // 不返回_id字段
skip()
和limit()
实现分页,避免一次性加载大量数据:db.orders.find().skip(20).limit(10); // 跳过前20条,返回接下来的10条
insertMany()
、updateMany()
替代循环的单条操作,减少网络往返次数:db.products.insertMany([{ "name": "Product A", "price": 100 }, { "name": "Product B", "price": 200 }]);
确保查询条件能利用索引,避免使用$where
、$regex
(正则表达式)等无法走索引的操作。
WiredTiger
是MongoDB的默认存储引擎,其缓存大小直接影响性能。建议设置为物理内存的50%-70%(如16GB内存设为8GB):
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
并添加到/etc/fstab
实现开机自动挂载。vm.swappiness
:降低系统使用Swap的倾向(值越小越倾向于使用内存),编辑/etc/sysctl.conf
:vm.swappiness=10 # 推荐值10-30
执行sudo sysctl -p
使配置生效。对于TB级以上的大数据量,使用分片将数据分布到多个服务器,提高读写吞吐量:
user_id
)作为分片键,避免数据倾斜。sh.addShard()
添加分片节点,sh.enableSharding()
启用分片。使用复制集提高数据冗余和读取性能:
mongod.conf
中的replication
部分:replication:
replSetName: "rs0"
启动后执行rs.initiate()
初始化副本集。readPreference: secondary
),减轻主节点压力。mongostat --host 127.0.0.1:27017
mongotop --host 127.0.0.1:27017
定期升级到最新稳定版本(如6.0及以上),新版本通常包含性能改进、bug修复和安全补丁。升级前需备份数据,并参考官方文档进行兼容性检查。
reIndex()
减少索引碎片,提高查询效率:db.users.reIndex();
通过以上多维度的优化措施,可显著提升MongoDB在Ubuntu上的性能。需根据实际业务场景(如数据量、并发量、查询模式)调整参数,并在测试环境中验证优化效果后再应用于生产环境。