在前面文章曾经提到,在MongoDB中一起使用$or和sort()时,查询性能会很差,详见:http://www.cnblogs.com/xinghebuluo/archive/2011/12/01/2270590.html
在mongodb的计划中,2.5.w版本中可能会修改这个bug。
我的项目中也遇到了这个问题,后来自己想了一个解决方案,暂时规避了这个问题,现在把这个方案分享出来,和大家讨论一下.
这个解决方案是受到了mongos的源代码的启示,众所周知mongodb是分布式架构,那么在我们使用mongos查询并使用排序的时候,mongos需要把查询请求发送给各个shard,并将每个shard的查询结果
存放在一个队列中(队列中已经排好序)。这里假定有2个shard(多个shard的原理是一样的),查询条件为{“age”:20},排序条件为:{"time":1},mongos实现示意图如下:
1. mongos首先向两个shard发送查询排序命令。
2.两个shard返回结果是排序后的两个队列,如图所示。
3.客户端在取记录时,mongos取出两个队列的第一个元素,判断time值小的记录返回给客户端。
4.客户端再取记录时,重复步骤3,从两个队列中取time值小的记录返回给客户端。
正是受到mongos的启发,在遇到or查询并sort的情况时,把or的查询条件分解为多次查询,然后实现了一个查询类,里面保存了list<DBObject q>,然后向mongos发起多次查询排序请求,
此时得到多个cursor,此时的cursor就类似于上面的队列,即此时得到了多个排序好的队列,然后经过简单比较后,依次把记录返回给客户端。
例如,此时查询{"$or":[{"age":20},{"name":"li"}]},排序条件为{"Time":1},可以分解为2次查询:{"age":20},{"name":"li"},执行查询后,得到两个cursor,即两个队列,如下:、
此时就可以重复mongos的步骤了,在客户端取记录时,对队列(cursor)中的第一个元素做比较,取出time值最小的记录返回给客户端。
该解决方案的优点如下:
1.可以使用索引,速度很快。
2.封装类后,可以供多个业务使用。
缺点如下:
1. 每个队列中会缓存一些记录,这无形中造成了一些流量浪费和内存浪费。
上面是我对这个方案的整体思路,欢迎大家讨论。
相关推荐
在Thinkphp中使用MongoDB进行多条件查询时,需要对框架提供的驱动进行一定的修改以适应MongoDB的查询方式。 在Thinkphp中实现多条件查询时,可以使用框架提供的查询构建器(Query Builder),但是当涉及到MongoDB的...
使用的是SafeMode.True开关),这个测的是安全插入性能会差多少4)查询一个索引后的数字列,返回10条记录(也就是10KB)的性能,这个测的是索引查询的性能5)查询两个索引后的数字列,返回10条记录(每条记录只
事务补偿设计模式是指在事务执行过程中,遇到错误或异常时,采取相应的补偿措施,以确保数据的一致性和可靠性。MongoDB提供了多种事务补偿设计模式,包括try-catch块、回滚机制、补偿逻辑等。 三、mongosaga事务...
MongoDB是一种流行的开源文档数据库系统,以其灵活性、可扩展性和高性能而受到许多企业和开发者青睐。在数据存储领域,特别是对于JavaScript开发,MongoDB提供了一种高效且易于集成的解决方案。本文将深入探讨如何...
MongoDB on Kubernetes技术解决方案旨在提供一种快速、灵活和高效的方式来部署和管理MongoDB数据库在Kubernetes集群中。该解决方案利用Kubernetes的强大API和Operator来实现MongoDB的自动化部署、监控和管理。 在...
除此之外,MongoDB 还提供了其他的查询方法和运算符,比如 `sort` 用于排序结果,`limit` 和 `skip` 分别用于限制返回结果的数量和跳过前几条,以及 `$and`, `$or`, `$not` 等逻辑运算符,以实现更复杂的逻辑组合...
在 MongoDB 中,可以使用 `sort()` 方法来对查询结果进行排序。例如,`db.users.find().sort({ username: 1, insertTime: -1 })` 将对查询结果按照 `username` 升序和 `insertTime` 降序进行排序。 对于分页,可以...
MongoDB性能测试报告详细分析了在大数据量环境下,包括GridFS和组合索引在内的性能表现。...报告最后总结了插入和查询的性能表现,并提出了一些未解决的问题,这些问题可能需要在后续的工作中继续探索。
在这个性能测试中,我们关注的是在MongoDB中存储1亿条记录时的随机查询性能。测试环境是基于CentOS 6.4的64位操作系统,硬件配置包括一颗Intel Xeon E5-2630 2.30GHz处理器、64GB内存和6块10K转速硬盘组成的RAID0...
MongoDB是一种流行的开源文档数据库系统,以其高性能、灵活性和易用性而闻名。在处理大量数据时,查询性能是衡量数据库效率的关键因素。对于工作1-3年的运维人员来说,理解并优化MongoDB的查询性能至关重要,这不仅...
**Spring MongoDB 中文文档** MongoDB 是一个高性能、开源、无模式的分布式文档数据库,而Spring Data MongoDB 是Spring ...无论是简单的数据操作还是复杂的查询,Spring Data MongoDB 都能提供简洁、强大的解决方案。
MongoDB是一种流行的开源文档数据库系统,它以其高性能、高可用性和可伸缩性而闻名。在实际应用中,查询性能是衡量数据库效率的关键指标。本文将深入探讨如何验证MongoDB查询性能并进行优化。 首先,我们需要理解...
MongoDB是一种分布式文档数据库,以其灵活性、高性能和可扩展性在现代互联网应用中备受青睐,尤其是在像京东这样的大型电商平台中。本文将深入探讨MongoDB在京东的使用情况,包括其核心特性、部署策略以及如何应对...
MongoDB是一种流行的开源、分布式文档型数据库,以其灵活性、高性能和易用性而备受开发者青睐。作为NoSQL数据库的一种,它存储数据的方式不同于传统的表结构,而是采用键值对、文档、集合的形式。MongoDB的官方中文...
"MongoDB集群性能优化实践" 本文档主要介绍了MongoDB集群性能优化实践,涵盖了从 MongoDB 集群优化到...本文档为我们提供了 MongoDB 集群性能优化的实践经验和解决方案,涵盖了从 MongoDB 集群优化到解决方案的分享。
MongoDB在Java中被广泛用于构建高性能、可扩展的数据存储解决方案。MongoDB是一个NoSQL数据库,以其灵活性、可伸缩性和高性能而闻名。在Java中使用MongoDB,我们可以借助Spring Data MongoDB框架,它提供了一种简化...