MongoDB Index Intersection

MongoDB Index Intersection,索引交集


MongoDB 索引交集,初次看到這個東西覺得很神奇,查了一下是在 2.6 版本提供的新功能。

用途是一個查詢中,可以使用兩把 Index 進行協助查詢,注意,至多只能是兩把!所以你想把每個欄位都單獨建立索引,讓他能夠自由組合就錯了。

說明文件開頭也聲明:

  • 請使用 Compound Index 而非使用 Index Intersection
  • explain 上也不會優先使用它
  • 若查詢中有排序,就不能使用它

看了上述三項,應該很多情境都不會用了。


在更細去探討之前,先了解 Index。

例如我們現有一把 Index

1
{ "category": 1, "name": 1 }

先來個 MongoDB Index 基本觀念,以下哪個查詢會使用此 Index

1
2
3
4
1. db.test.find().sort({ name : 1 })
2. db.test.find({ name: { $in: [ "Bob", "Life" ] }})
3. db.test.find({ name: { $in: [ "Bob", "Life" ] }}).sort({ category : 1 })
4. db.test.find({ age: 13 }}).sort({ category : 1 })

如果稍有疑慮,可以再去研究一下囉


什麼是 Index Intersection

例如我們現有 2 把 Index

1
2
{ "category": 1 }
{ "name": 1, "age": -1 }

db.test.find({ category: "dog" }).sort({ name: 1 })

這個查詢語法就會同時使用上述兩把 Index,稱為 Index Intersection
若是使用到 age 欄位查詢但沒帶 name,則不會使用到兩把。


不能排序的狀況

例如我們現有 4 把 Index

1
2
3
4
{ "category": 1 }
{ "name": 1, "age": -1 }
{ "name": 1}
{ "age": -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 似乎也想淡忘這個設計,使用者相關討論更是少了。

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。