MongoDB在Ubuntu上的索引優化策略
為經常用于查詢條件的字段創建索引是提升查詢性能的基礎。例如,若頻繁通過userid
字段查詢,可執行db.transactions.createIndex({userid: 1})
(1
表示升序索引)。需根據查詢模式針對性創建,避免盲目添加索引。
userid
字段);db.collection.createIndex({field1: 1, field2: -1})
,-1
表示降序),需將選擇性高的字段(區分度高的字段)放在前面;tags
數組),自動為數組每個元素創建索引;2dsphere
索引用于地理位置數據)。通過explain()
方法查看查詢執行計劃,確認索引是否被正確使用。例如,db.transactions.find({userid: 1}).explain('executionStats')
可顯示索引命中情況、掃描文檔數、執行時間等指標,幫助識別索引未生效的問題。
每個索引都會增加寫入操作的開銷(如插入、更新時需同步更新索引)并占用存儲空間。定期審查索引,刪除不再使用的索引(可通過db.collection.dropIndex("indexName")
刪除)。
隨著數據增長,索引可能產生碎片,影響查詢性能。使用reindex()
方法重建索引(如db.transactions.reIndex()
),減少碎片并優化索引結構。
若查詢的所有字段均包含在索引中,MongoDB可直接從索引中返回結果,無需訪問原始文檔(稱為“覆蓋查詢”)。例如,若索引為{userid: 1, name: 1}
,查詢db.transactions.find({userid: 1}, {name: 1, _id: 0})
可使用覆蓋索引,顯著減少磁盤IO。
通過mongostat
(監控操作速率)和mongotop
(監控集合級讀寫時間)工具實時監控索引性能;也可使用第三方工具如Percona Monitoring and Management (PMM),獲取更詳細的索引使用率、慢查詢等指標。
若數據量極大(如TB級別),單個節點無法承載,可使用MongoDB分片功能將數據分布到多個服務器。分片鍵需選擇高頻查詢字段或基數高的字段(如userid
),確保查詢能均勻分布到各個分片。