性能調優的前提是具備合適的硬件資源,需優先滿足以下要求:
storage.wiredTiger.engineConfig.cacheSizeGB參數配置),避免內存不足導致頻繁磁盤交換。編輯/etc/mongod.conf(MongoDB主配置文件),調整關鍵參數以匹配業務需求:
blockCompressor: snappy),減少磁盤占用并提升I/O效率。0.0.0.0(允許遠程訪問,生產環境需限制可信IP);調整maxIncomingConnections(如1000),適應高并發連接場景。replication.replSetName: "rs0",后續通過rs.initiate()初始化副本集,提升讀取性能和數據冗余。索引是MongoDB性能的核心,需遵循以下原則:
username、email)創建單字段索引(db.users.createIndex({ username: 1 }));對多字段聯合查詢(如name+age)創建復合索引(db.users.createIndex({ name: 1, age: 1 }))。db.collection.getIndexes()檢查并刪除未使用的索引。db.users.find({ username: 1 }, { username: 1, _id: 0 })),MongoDB可直接從索引獲取數據,無需訪問實際文檔,大幅提升查詢速度。explain("executionStats")(如db.users.find({ username: "admin" }).explain("executionStats"))查看索引使用情況,識別未走索引的查詢并優化。優化查詢語句可減少資源消耗,提升響應速度:
$where、$regex等低效操作符,盡量使用精確匹配(如{ age: 25 })或范圍查詢(如{ age: { $gt: 18 } })。projection參數限制返回字段(如db.users.find({}, { username: 1, email: 1, _id: 0 })),避免返回不必要的數據(如_id),減少網絡傳輸量。{ age: { $lt: 0 } })或無索引字段查詢。bulkWrite()替代單條插入/更新(如db.users.bulkWrite([{ insertOne: { document: { name: "Alice" } } }, { updateOne: { filter: { name: "Bob" }, update: { $set: { age: 30 } } } }])),減少網絡往返次數,提升吞吐量。內存是MongoDB的性能瓶頸之一,需合理配置:
storage.wiredTiger.engineConfig.cacheSizeGB(如4GB內存服務器可設為2-3GB),確保緩存足夠容納熱點數據和索引。storage.wiredTiger.collectionConfig.blockCompressor選擇壓縮算法(snappy、zlib或lz4),snappy為默認選項(平衡壓縮率與性能),zlib壓縮率更高但消耗更多CPU。compact命令(如db.runCommand({ compact: 'users' }))整理數據文件,回收未使用的空間;對于嚴重碎片化的集合,可使用repairDatabase修復。對于大規模數據或高并發場景,需通過架構擴展提升性能:
replication.replSetName),將讀操作指向secondary節點(通過readPreference: "secondaryPreferred"),減輕主節點壓力,提升讀取性能。sh.enableSharding("mydb"))將數據分散到多個服務器,水平擴展存儲和計算能力;選擇合適的分片鍵(如user_id),避免數據傾斜。rs.status()),確保同步正常。持續監控是性能調優的重要環節,需定期執行以下操作:
mongostat(監控每秒查詢次數、插入/更新/刪除操作數)和mongotop(查看熱點集合的讀寫時間)實時監控性能;通過db.currentOp()查看當前正在執行的操作,識別慢操作。systemLog.slowQueryLog: true,systemLog.slowQueryThresholdMs: 100),通過explain()分析慢查詢的執行計劃,優化索引或查詢語句。reIndex()重建碎片化索引;每月執行repairDatabase修復數據文件;定期備份數據(使用mongodump),確保數據安全。