Ubuntu環境下MongoDB索引優化技巧
為經常用于查詢條件的字段創建索引是提升查詢性能的基礎。例如,若經常根據userid字段查詢,可執行db.transactions.createIndex({userid: 1})創建升序索引。需根據查詢模式針對性創建,避免盲目添加索引。
db.collection.createIndex({field: 1}));db.collection.createIndex({field1: 1, field2: -1})),字段順序需匹配查詢條件;db.collection.createIndex({location: "2dsphere"}));db.collection.createIndex({content: "text"}))。通過explain()方法查看查詢執行計劃,判斷索引是否被有效利用。例如,db.collection.find({query}).explain("executionStats")可返回keysExamined(掃描的索引鍵數量)、docsExamined(掃描的文檔數量)等指標,若keysExamined遠大于nreturned(返回的文檔數量),則需優化索引。
{age: 1, name: 1}比{name: 1, age: 1}更適合查詢age > 18);{a:1, b:1}和{b:1, a:1}只需保留一個;包含關系的索引(如{b:1, c:1}和{a:1, b:1, c:1})只需保留后者;{a:1, b:1, d:1, e:-1, c:1})。若查詢的所有字段都包含在索引中,MongoDB可直接從索引返回結果,無需訪問源文檔(稱為“覆蓋查詢”)。例如,查詢{field1: value1, field2: value2}時,創建索引{field1:1, field2:1}并確保查詢不返回_id(或將其加入索引)??赏ㄟ^explain()的totalDocsExamined: 0判斷是否為覆蓋查詢。
db.collection.reIndex()重建索引以減少碎片;db.collection.dropIndex("indexName")刪除不再使用的索引,減少存儲占用和寫操作開銷。在特殊場景下,可使用hint()強制MongoDB使用指定索引(如測試索引性能或優化復雜查詢)。例如,db.collection.find({query}).hint({field:1})。
使用MongoDB自帶工具(如mongostat查看索引操作統計、mongotop查看集合級別的索引使用情況)或第三方工具(如Percona Monitoring and Management (PMM))實時監控索引性能,及時發現性能瓶頸。