热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在MongoDB中一起使用$or和sort()时,查询性能差的一种解决方案

在MongoDB中一起使用$or和sort()时,查询性能差的一种解决方案在前面文章曾经提到,在MongoDB中一起使用$or和sort()时,查询性能会很差,详见:在mongodb的计划中,2.5.w版本中可能会修改这个bug。我的项目中也遇到了这个问题,后来自己想了一个解决方案

在MongoDB中一起使用$or和sort()时,查询性能差的一种解决方案 在前面文章曾经提到,在MongoDB中一起使用$or和sort()时,查询性能会很差,详见: 在mongodb的计划中,2.5.w版本中可能会修改这个bug。 我的项目中也遇到了这个问题,后来自己想了一个解决方案

在MongoDB中一起使用$or和sort()时,查询性能差的一种解决方案

在前面文章曾经提到,在MongoDB中一起使用$or和sort()时,查询性能会很差,详见:

在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,网站空间,然后向mongos发起多次查询排序请求,

此时得到多个cursor,此时的cursor就类似于上面的队列,即此时得到了多个排序好的队列,然后经过简单比较后,依次把记录返回给客户端。

例如,此时查询{"$or":[{"age":20},{"name":"li"}]},排序条件为{"Time":1},香港服务器,可以分解为2次查询:{"age":20},{"name":"li"},执行查询后,得到两个cursor,即两个队列,如下:、

此时就可以重复mongos的步骤了,在客户端取记录时,对队列(cursor)中的第一个元素做比较,取出time值最小的记录返回给客户端。

该解决方案的优点如下:

1.可以使用索引,速度很快。

2.封装类后,服务器空间,可以供多个业务使用。

缺点如下:

1. 每个队列中会缓存一些记录,这无形中造成了一些流量浪费和内存浪费。

上面是我对这个方案的整体思路,欢迎大家讨论。

posted on


推荐阅读
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • NTP服务器配置详解:原理与工作模式
    本文深入探讨了网络时间协议(NTP)的工作原理及其多种工作模式,旨在帮助读者全面理解NTP的配置参数和应用场景。NTP是基于RFC 1305的时间同步标准,广泛应用于分布式系统中,确保设备间时钟的一致性。 ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 创邻科技成功举办Graph+X生态合作伙伴大会,30余家行业领军企业共聚杭州
    9月22日,创邻科技在杭州举办“Graph+X”生态合作伙伴大会,汇聚了超过30家行业头部企业的50多位企业家和技术领袖,共同探讨图技术的前沿应用与发展前景。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • 深入解析BookKeeper的设计与应用场景
    本文介绍了由Yahoo在2009年开发并于2011年开源的BookKeeper技术。BookKeeper是一种高效且可靠的日志流存储解决方案,广泛应用于需要高性能和强数据持久性的场景。 ... [详细]
  • Go语言以其简洁的语法和强大的并发处理能力而闻名,特别是在云计算和分布式计算领域有着广泛的应用。本文将深入探讨Go语言中的Channel机制,包括其不同类型及其在实际编程中的应用。 ... [详细]
  • window下kafka的安装以及测试
    目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
  • 本文详细介绍了使用ZooKeeper构建高可用集群的方法,包括必要的软件环境准备、配置文件调整及集群启动等关键步骤。通常,一个ZooKeeper集群由奇数个节点组成,以确保Leader选举的有效性。 ... [详细]
author-avatar
SJ曹圭贤V
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有