热门标签 | 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同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文探讨了2012年4月期间,淘宝在技术架构上的关键数据和发展历程。涵盖了从早期PHP到Java的转型,以及在分布式计算、存储和网络流量管理方面的创新。 ... [详细]
  • 云计算的优势与应用场景
    本文详细探讨了云计算为企业和个人带来的多种优势,包括成本节约、安全性提升、灵活性增强等。同时介绍了云计算的五大核心特点,并结合实际案例进行分析。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • ZooKeeper集群脑裂问题及其解决方案
    本文深入探讨了ZooKeeper集群中可能出现的脑裂问题,分析其成因,并提供了多种有效的解决方案,确保集群在高可用性环境下的稳定运行。 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • NTP服务器配置详解:原理与工作模式
    本文深入探讨了网络时间协议(NTP)的工作原理及其多种工作模式,旨在帮助读者全面理解NTP的配置参数和应用场景。NTP是基于RFC 1305的时间同步标准,广泛应用于分布式系统中,确保设备间时钟的一致性。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
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社区 版权所有