Debian環境下MongoDB索引優化技巧
mongostat
、mongotop
或explain()
輸出),識別高頻查詢字段(如username
、status
、createTime
),為其創建針對性索引。例如,若應用頻繁通過username
查詢用戶信息,可執行db.users.createIndex({ username: 1 })
。status
(選擇性高,如“paid”訂單占比低)和createTime
(范圍查詢),應創建db.orders.createIndex({ status: 1, createTime: -1 })
,而非{ createTime: -1, status: 1 }
。text
索引(如db.blog.createIndex({ title: "text", content: "text" })
)、地理位置查詢用2dsphere
索引(如db.locations.createIndex({ coordinates: "2dsphere" })
)、自動過期數據用TTL
索引(如db.sessions.createIndex({ expireAt: 1 }, { expireAfterSeconds: 0 })
)。username
和email
,可創建復合索引db.users.createIndex({ username: 1, email: 1 })
,此時查詢db.users.find({ username: "Alice" }, { email: 1, _id: 0 })
可直接從索引獲取數據,無需讀取文檔。explain("executionStats")
分析查詢計劃,確認是否使用了索引(winningPlan.inputStage.stage
應為IXSCAN
而非COLLSCAN
);避免大范圍查詢(如無索引的$gt
/$lt
條件);使用投影({ field: 1, _id: 0 }
)限制返回字段,減少數據傳輸量。reIndex()
方法重建索引(如db.users.reIndex()
),或在低峰期執行compact
命令壓縮數據文件(如db.runCommand({ compact: 'users' })
)。db.collection.stats()
查看索引大小、使用次數(indexDetails.<indexName>.accesses.ops
);使用db.currentOp()
監控慢索引操作;定期刪除未使用的索引(如30天內未被查詢的索引),減少寫操作開銷(每個索引都會增加插入、更新、刪除的時間)。/etc/mongod.conf
文件,優化以下參數——storage.wiredTiger.engineConfig.cacheSizeGB
(設置為物理內存的50%-70%,用于緩存數據和索引)、net.maxIncomingConnections
(根據并發連接數調整,默認10000,避免過多連接導致資源競爭)。_id
、user_id
或復合鍵{ user_id: 1, createTime: 1 }
),確保分片鍵具有高基數(唯一值多)和均勻分布。readPreference: "secondaryPreferred"
),減輕主節點的讀取壓力,提升整體查詢吞吐量。