mongodb複合索引排序

簡介

mongodb中的索引與其他數據庫的索引在使用上沒有本質上的區別,他的底層使用B-tree實現。

mongodb的複合索引

複合索引的順序

創建複合索引以支持對多個字段進行排序。
您可以在索引的所有鍵或子集上指定排序; 但是,排序鍵必須按照它們在索引中出現的順序列出。 例如,索引鍵樣式{a:1,b:1}可以支持{a:1,b:1}上的排序,但不能支持{b:1,a:1}上的排序。
爲了使查詢使用複合索引進行排序,cursor.sort()文檔中所有鍵的指定排序方向必須與索引鍵模式匹配或與索引鍵模式的反方向匹配。 例如,索引鍵模式{a:1,b:-1}可以支持{a:1,b:-1}和{a:-1,b:1}上的排序,但不能支持{a:- 1,b:-1}或{a:1,b:1}。

複合索引的前綴

如果排序鍵對應於索引鍵或索引前綴,則MongoDB可以使用索引對查詢結果進行排序。 複合索引的前綴是在索引鍵模式的開頭由一個或多個鍵組成的子集。
例如,在數據集合上創建一個複合索引:

db.data.createIndex( { a:1, b: 1, c: 1, d: 1 } )

以下都能匹配到該索引:

{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }

Example Index Prefix
db.data.find().sort( { a: 1 } ) { a: 1 }
db.data.find().sort( { a: -1 } ) { a: 1 }
db.data.find().sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } ) { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
當通過索引來進行查詢和排序的的時候,這些操作不需要在內存中對結果集在進行排序。

索引的排序和非前綴子集

索引可以支持對索引鍵模式的非前綴子集進行排序操作。 爲此,查詢必須在排序鍵之前的所有前綴鍵上包含相等條件。
例子:
集合有如下索引

{ a: 1, b: 1, c: 1, d: 1 }

以下操作可以使用索引來獲取排序順序:
Example Index Prefix
db.data.find( { a: 5 } ).sort( { b: 1, c: 1 } ) { a: 1 , b: 1, c: 1 }
db.data.find( { b: 3, a: 4 } ).sort( { c: 1 } ) { a: 1, b: 1, c: 1 }
db.data.find( { a: 5, b: { $lt: 3} } ).sort( { b: 1 } ) { a: 1, b: 1 }

複合索引sort

在實際操作mongodb的過程中,發現將find與sort結合使用時,mongodb優先使用sort查詢條件可以利用的索引,只有當sort查詢條件沒有索引可用時,才嘗試利用find查詢條件中的索引。
若是sort中的索引無法命中find()中的索引,那麼find()操作就會執行全網掃描

參考文章:
https://docs.mongodb.com/manual/indexes/#default-id-index
https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-on-multiple-fields
https://blog.csdn.net/u010205879/article/details/50834908

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章