MongoDB 的索引是提高查詢性能的核心機制,類似于傳統關系型數據庫的索引。以下是對 MongoDB 索引的詳細說明:
一、索引基礎
1. 索引的作用
加速查詢:通過索引快速定位數據,避免全集合掃描(COLLSCAN)。
排序優化:索引可以加速排序操作(如 sort())。
唯一性約束:通過唯一索引(unique: true)確保字段值不重復。
稀疏性控制:稀疏索引(sparse: true)僅對存在該字段的文檔創建索引。
2. 默認索引
MongoDB 自動為 _id 字段創建唯一索引,不可刪除。
二、索引類型
1. 單字段索引(Single Field Index)
對單個字段創建索引:
javascript
復制
db.collection.createIndex({ field: 1 }) ?// 1 表示升序,-1 表示降序
適用于精確匹配或范圍查詢的字段。
2. 復合索引(Compound Index)
對多個字段聯合創建索引:
javascript
復制
db.collection.createIndex({ field1: 1, field2: -1 })
字段順序重要:查詢條件中字段的順序需與索引一致或前綴匹配。
排序優化:索引字段的順序會影響 sort() 的性能。
3. 多鍵索引(Multikey Index)
自動為數組字段中的每個元素創建索引:
javascript
復制
db.collection.createIndex({ arrayField: 1 })
適用于查詢數組中的元素(如 arrayField: value)。
4. 文本索引(Text Index)
支持全文搜索:
javascript
復制
db.collection.createIndex({ content: "text" })
支持多字段聯合文本索引:
javascript
復制
db.collection.createIndex({ title: "text", description: "text" })
5. 地理空間索引(Geospatial Index)
2dsphere:支持球面幾何查詢(如經緯度):
javascript
復制
db.places.createIndex({ location: "2dsphere" })
2d:支持平面幾何查詢(適用于舊版本)。
6. 哈希索引(Hashed Index)
對字段值計算哈希后創建索引,常用于分片鍵:
javascript
復制
db.collection.createIndex({ field: "hashed" })
7. TTL 索引(Time-To-Live Index)
自動刪除過期文檔(如日志數據):
javascript
復制
db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })
8. 唯一索引(Unique Index)
確保字段值唯一:
javascript
復制
db.users.createIndex({ email: 1 }, { unique: true })
9. 稀疏索引(Sparse Index)
僅索引包含該字段的文檔:
javascript
復制
db.users.createIndex({ phone: 1 }, { sparse: true })
三、索引管理
1. 查看索引
javascript
復制
db.collection.getIndexes() ?// 查看集合的所有索引
2. 刪除索引
javascript
復制
db.collection.dropIndex("indexName") ?// 刪除指定索引
db.collection.dropIndexes() ? ? ? ? ? // 刪除所有索引(保留 _id 索引)
3. 重建索引
javascript
復制
db.collection.reIndex() ?// 重建所有索引(慎用,可能阻塞操作)
四、索引使用策略
1. 索引選擇
MongoDB 查詢優化器會自動選擇最優索引。
可通過 explain() 分析查詢執行計劃:
javascript
復制
db.collection.find({ field: "value" }).explain("executionStats")
2. 覆蓋查詢(Covered Query)
如果查詢結果完全由索引字段提供,無需回表查文檔:
javascript
復制
// 創建復合索引
db.users.createIndex({ name: 1, age: 1 })
// 覆蓋查詢示例
db.users.find({ name: "Alice" }, { _id: 0, name: 1, age: 1 })
3. 索引交集(Index Intersection)
MongoDB 可以將多個索引的結果合并,但通常復合索引更高效。
五、索引的限制與注意事項
內存占用:
索引存儲在內存中,大集合的索引可能占用較多內存。
寫操作開銷:
索引會降低插入、更新、刪除操作的性能。
索引鍵大小限制:
索引鍵(Index Key)的總大小不能超過 1024 字節。
查詢模式匹配:
某些查詢可能無法使用索引(如正則表達式未左錨定)。
六、最佳實踐
優先使用復合索引:避免創建過多單字段索引。
避免全集合掃描:對高頻查詢字段建立索引。
索引選擇性:高基數(唯一值多)的字段更適合建索引。
監控索引使用:
javascript
復制
db.collection.aggregate([{ $indexStats: {} }])
刪除冗余索引:定期清理未使用的索引。
示例場景
場景 1:查詢優化
javascript
復制
// 創建復合索引
db.orders.createIndex({ customerId: 1, orderDate: -1 })
// 查詢最近訂單
db.orders.find({ customerId: 123 }).sort({ orderDate: -1 })
場景 2:唯一約束
javascript
復制
// 確保用戶名唯一
db.users.createIndex({ username: 1 }, { unique: true })
通過合理設計索引,可以顯著提升 MongoDB 的查詢性能,但需根據實際場景權衡讀寫開銷。