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

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