優化查詢語句
explain("executionStats")分析查詢計劃,確認是否使用了索引(避免COLLSCAN全表掃描)。例如,對常用查詢字段(如user_id、status)創建單字段索引:db.collection.createIndex({ user_id: 1 })。limit()方法減少返回的文檔數量,避免一次性傳輸大量數據。例如,db.collection.find({ status: "active" }).limit(100)。_id字段,除非必要),減少數據傳輸量。例如,db.collection.find({ category: "books" }, { title: 1, author: 1, _id: 0 })。$where子句(會觸發JavaScript引擎執行,性能極差),改用索引支持的查詢條件;避免對未索引字段進行排序(會導致SORT階段全表掃描)。索引策略優化
find、sort、aggregate操作的字段創建索引。例如,對{ status: "active", create_time: -1 }的查詢,創建復合索引{ status: 1, create_time: -1 }(選擇性高的字段放前面)。{ a: 1, b: 2, c: { $gte: 1 } }.sort({ d: 1 }),應創建索引{ a: 1, b: 1, d: 1, c: 1 }(等值字段a、b在前,排序字段d其次,范圍字段c最后)。{ name: 1, age: 1 },查詢{ name: "Alice", age: 25 }且僅返回name、age字段時,可直接從索引獲取數據(explain()中totalDocsExamined為0)。db.collection.aggregate([{ $indexStats: {} }])查看索引使用情況),減少寫操作的開銷(插入、更新、刪除時需維護索引)。配置優化
storage.wiredTiger.engineConfig.cacheSizeGB參數(設置為物理內存的50%-75%),增加內存緩存數據和索引的比例,減少磁盤I/O。systemLog.verbosity(設為0,僅記錄錯誤信息),減少日志寫入頻率;合理設置日志文件大小和滾動策略,避免頻繁的磁盤I/O操作。net.maxIncomingConnections(默認10000,可根據并發連接數調整),避免過多連接導致資源競爭;設置operationProfiling.maxTimeMS(如100ms),監控慢查詢。硬件優化
分片與副本集
user_id分片),實現水平擴展,提高查詢和寫入的并發能力。選擇合適的分片鍵(如高基數的user_id,避免熱點問題)。readPreference: "secondary"),減輕主節點的讀取壓力,提高讀取性能。監控與維護
mongostat(監控QPS、延遲)、mongotop(監控集合級別的讀寫時間)、Prometheus+Grafana(可視化監控內存、CPU、磁盤I/O)等工具,實時監控數據庫性能,及時發現瓶頸。slowms設為100ms),通過db.setProfilingLevel(2)記錄慢查詢,使用db.system.profile.find().sort({ ts: -1 }).limit(10)查看最近的慢查詢,針對性優化。db.collection.reIndex()重建索引(清理碎片,提高索引效率);清理無用數據(如過期的日志、臨時數據),減少數據量。