十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
使用索引来排序查询结果
创新互联建站长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为重庆企业提供专业的网站建设、成都网站建设,重庆网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。在MongoDB中,排序操作可以通过从索引中按照索引顺序获取文档的方式来保证结果的有序性。如果查询计划器(planner)无法从索引中得到排序顺序,那么它将需要在内存中排序结果。相比于不使用索引的排序操作,使用索引会有更好的性能。此外,如果 不使用 索引的排序操作使用了超过32M的内存,那么操作会终止。
使用单键索引排序
如果一个递增或递减索引是单键索引,那么在该键上的排序操作可以是任意方向。
例如,在集合 records 的 a 键上创建递增的索引:
db.records.ensureIndex( { a: 1 } )索引可以支持在 a 上的递增排序:
db.records.find().sort( { a: 1 } )索引也支持如下在 a 上的递减排序,通过以相反的顺序遍历索引的方式:
db.records.find().sort( { a: -1 } )在多个键上排序
创建 复合索引 以支持在多个键上排序。
您可以指定在索引的所有键或者部分键上排序。但是,排序键的顺序必须和它们在索引中的排列顺序 一致 。例如,索引 { a: 1, b: 1 } 可以支持排序 { a: 1, b: 1 } 但不支持 { b: 1, a: 1 } 排序。
此外,sort中指定的所有键的排序顺序(例如递增/递减)必须和索引中的对应键的排序顺序 完全相同, 或者 完全相反 。例如,索引 { a: 1, b: 1 } 可以支持排序 { a: 1, b: 1 } 和排序 { a: -1, b: -1 } ,但 不支持 排序 { a: -1, b: 1 } 。
排序与索引前缀
如果排序的键符合索引的键或者 前缀 ,那么MongoDB可以使用索引来排序查询结果。复合索引的前缀是指被索引键的子集,由一个或多个排在最开始的键组成。
例如,在集合 data 上创建一个复合索引:
db.data.ensureIndex( { a:1, b: 1, c: 1, d: 1 } )那么,该索引的前缀如下:
{ a: 1 } { a: 1, b: 1 } { a: 1, b: 1, c: 1 }如下查询和排序操作可以使用索引前缀来排序查询结果。这些操作不需要在内存中对结果集排序。
例子 索引前缀
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 }假设有如下例子,索引的前缀键出现在查询条件和排序中:
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } )在这种情况下,MongoDB可以使用索引按照sort指定的顺序来获取文档。如例子中所示,在查询条件中的索引前缀可以和在sort中出现的前缀不一样。
用非前缀的索引键排序
索引也支持使用非前缀的键来排序。在这种情况下,对于索引中排列在排序键的前面的所有键,查询语句中必须包含针对它们的 相等匹配 的条件。
例如,集合 data 有如下索引:
{ a: 1, b: 1, c: 1, d: 1 }如下操作可以使用索引来排序:
例子 索引前缀
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 }如最后一个操作所示,只有索引中那些排列在排序键 前面 的键必须在查询语句中有相等匹配条件;其他索引键则可以指定其他匹配条件。
如果查询语句 没有 对排列在排序键前面或者与之有所重叠的前缀键指定相等匹配条件,那么操作将 不会 有效使用索引。例如,如下操作指定了排序 { c: 1 } ,但是查询语句并没有对前缀键 a 和 b 指定相等匹配:
db.data.find( { a: { $gt: 2 } } ).sort( { c: 1 } ) db.data.find( { c: 5 } ).sort( { c: 1 } )这些操作 将不会 高效地使用索引 { a: 1, b: 1, c: 1, d: 1 } ,且可能甚至不会使用该索引来获取文档。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。