一、索引創建:聚焦查詢需求與類型選擇
在CentOS環境下優化MongoDB索引,精準識別高頻查詢字段是基礎。通過分析應用查詢模式(如登錄時的username
查詢、商品列表的category
+price
篩選),優先為這些字段創建索引。對于單字段高頻查詢(如username
),使用單字段索引(db.users.createIndex({username: 1})
);對于多字段組合查詢(如同時按username
和age
篩選),創建復合索引(db.users.createIndex({username: 1, age: -1})
),注意字段順序需匹配查詢條件(如復合索引{a:1, b:1}
無法優化b
開頭的查詢)。此外,根據數據特性選擇索引類型:文本搜索用文本索引(db.articles.createIndex({content: "text"})
)、地理位置查詢用2dsphere索引(db.locations.createIndex({coord: "2dsphere"})
)、自動過期數據用TTL索引(db.sessions.createIndex({expireAt: 1}, {expireAfterSeconds: 3600})
)。
二、索引優化:避免冗余與提升效率
db.collection.getIndexes()
查看現有索引,刪除未使用或重復的索引(如username
和email
都設為唯一索引時,若業務允許可合并為一個)。db.users.find({username: "admin"}, {username: 1, _id: 0})
),可避免訪問文檔本身,顯著提升查詢速度。通過explain("executionStats")
檢查totalDocsExamined
是否為0,確認是否為覆蓋索引。db.collection.reIndex()
重建索引,優化索引碎片(尤其是頻繁更新的集合),提升索引讀取效率。三、查詢分析與監控:精準定位優化點
使用explain()
方法分析查詢計劃,重點關注以下指標:
winningPlan
中的stage
為IXSCAN
,說明使用了索引;若為COLLSCAN
,則表示全表掃描,需優化索引。executionStats
中的keysExamined
(掃描的索引鍵數量)和docsExamined
(掃描的文檔數量)比值越大,說明索引效率越高;若keysExamined
遠大于nReturned
(返回的文檔數量),則索引可能不夠精準。db.setProfilingLevel(1)
)記錄慢查詢日志(默認閾值100ms),分析慢查詢的索引使用情況,針對性優化。四、硬件與配置:支撐索引性能的基礎
/etc/mongod.conf
中的storage.wiredTiger.engineConfig.cacheSizeGB
調整緩存大?。ㄈ缭O置為8GB)。transparent_hugepage=never
(修改/etc/default/grub
后重啟系統)。五、高級優化:針對復雜場景的策略
user_id
),避免數據傾斜。background: true
(后臺創建索引,不影響業務)、unique: true
(確保字段唯一性,如email
)、sparse: true
(僅索引包含該字段的文檔,如phone
字段可能為null)。hint()
方法強制指定索引(如db.users.find({username: "admin"}).hint({username: 1})
),但需謹慎使用(避免人為錯誤)。