MongoDB Index Intersection,索引交集
MongoDB 索引交集,初次看到這個東西覺得很神奇,查了一下是在 2.6 版本提供的新功能。
用途是一個查詢中,可以使用兩把 Index 進行協助查詢,注意,至多只能是兩把!所以你想把每個欄位都單獨建立索引,讓他能夠自由組合就錯了。
說明文件開頭也聲明:
- 請使用
Compound Index
而非使用Index Intersection
explain
上也不會優先使用它- 若查詢中有排序,就不能使用它
看了上述三項,應該很多情境都不會用了。
在更細去探討之前,先了解 Index。
例如我們現有一把 Index
1 | { "category": 1, "name": 1 } |
先來個 MongoDB Index 基本觀念,以下哪個查詢會使用此 Index
1 | 1. db.test.find().sort({ name : 1 }) |
如果稍有疑慮,可以再去研究一下囉
什麼是 Index Intersection
例如我們現有 2 把 Index
1 | { "category": 1 } |
db.test.find({ category: "dog" }).sort({ name: 1 })
這個查詢語法就會同時使用上述兩把 Index,稱為 Index Intersection
。
若是使用到 age
欄位查詢但沒帶 name
,則不會使用到兩把。
不能排序的狀況
例如我們現有 4 把 Index
1 | { "category": 1 } |
db.test.find({ category: "dog" }).sort({ name: 1 })
這個查詢就無法使用 Index Intersection
,即便各自都有一把單一欄位 Index
db.test.find({ category: "dog", name: "Bob" }).sort({ age: -1 })
這個查詢就可以滿足部分查詢。
講到這邊我就想先打住了,除了上述限制很多之外,使用 compound index
效率始終是比 index intersection
來得好,光是這點就不想再細看下去了。如果想瞭解更多,可以查看 MongoDB 官方 Jira 回覆 SERVER-3071,雖然是很古老了,但後來 MongoDB 似乎也想淡忘這個設計,使用者相關討論更是少了。