MongoDB在Ubuntu上的索引策略
在Ubuntu系統上部署MongoDB時,索引策略的核心是通過合理設計索引結構、優化查詢匹配及持續維護,平衡查詢性能與系統開銷(如存儲、寫入延遲)。以下是具體策略的詳細說明:
索引的設計需緊密貼合應用的查詢模式(如常用查詢字段、排序需求、返回字段)。優先為高頻查詢字段(如userid
、order_status
)、排序字段(如create_time
降序)及范圍查詢字段(如age > 18
)創建索引。例如,若應用經常通過userid
查詢交易記錄,可創建單字段索引:db.transactions.createIndex({userid: 1})
;若需同時查詢userid
和create_time
并按時間排序,可創建復合索引:db.transactions.createIndex({userid: 1, create_time: -1})
。
復合索引(Compound Index)的字段順序需遵循ESR規則(Equality-Sort-Range):
=
條件的字段放在最前面(如userid
);sort()
操作的字段(如create_time
);>
、<
、in
等范圍條件的字段(如age
)。userid = 123
且create_time
在最近7天的記錄,復合索引{userid: 1, create_time: -1}
能最大化利用索引,避免全表掃描。根據數據類型和查詢需求選擇合適的索引類型:
db.users.find({username: "john"})
);db.orders.find({userid: 1, status: "paid"}).sort({create_time: -1})
);tags
數組),MongoDB會為數組每個元素創建索引鍵;location
字段的$near
操作);content
字段的$text
查詢);expireAt
字段,設置文檔存活時間)。**覆蓋查詢(Covered Query)**是指查詢的所有字段(包括過濾、排序、返回字段)均包含在索引中,無需訪問原始文檔。通過explain("executionStats")
查看totalDocsExamined
字段,若值為0則表示查詢被覆蓋。例如,若查詢只需userid
和create_time
,可將這兩個字段加入復合索引:db.transactions.createIndex({userid: 1, create_time: -1, amount: 1})
,并確保查詢中排除_id
字段(或將其加入索引)。
索引雖能提升查詢性能,但會增加寫入開銷(每次插入、更新需維護索引)和存儲成本。定期使用db.collection.stats()
查看索引大小,或通過$indexStats
聚合管道(db.collection.aggregate([{ $indexStats: {} }])
)分析索引使用頻率(如accesses.ops
表示索引被訪問的次數)。刪除未使用或低使用率的索引(如30天內未被訪問的索引),以釋放資源。
db.collection.reIndex()
命令重建索引,減少碎片;db.collection.stats().indexDetails.<index_name>.frag
查看碎片率,若超過30%建議重建。使用MongoDB自帶工具監控索引性能:
winningPlan.inputStage.stage
為IXSCAN
表示使用了索引);mongostat
監控索引操作速率(如idx miss
表示索引未命中次數),mongotop
查看集合級別的讀寫時間分布;db.orders.createIndex({status: 1}, {partialFilterExpression: {status: "pending"}})
),減少索引大??;metadata
子文檔的不同鍵),但需謹慎使用(避免替代針對性索引);storage.wiredTiger.engineConfig.cacheSizeGB
(設置為物理內存的50%-75%),確保索引能緩存在內存中,提升訪問速度。