从应用程序的角度来看,查询分片集群和查询单个mongod没什么区别。这两种情况下,查询接口和迭代结果集的过程是一样的。但在外表之下,两者还是有区别的,我们需要从细节层面进行了解。

1. 分片查询类型

假设正在查询一个分片集群,为了返回一个恰当的查询响应,mongos要与多少个分片进行交互。稍微思考一下,就能发现这与分片键是否出现在查询选择器里有关。配置服务器(就是mongos)维护了一份分片范围的映射关系,就是我们在前面博文中描述的块。如果查询包含分片键,那么mongos通过数据块能够很快定位哪个分片包含查询的结果集。这个称为针对性查询(targeted query)

但是,如果分片键不时查询的一部分,那么查询计划器就不得不访问所有分片来完成查询。这称为全局查询或分散/聚合查询(scatter/gather query)。下图描述了这两种查询。

针对任意指定的分片集群查询,explain命令能显示其详细查询路径。首先看一个针对性查询,此处要查询一个随机文档。

explain结果清晰地说明了查询命中了一个分片-分片A,返回一个文档。查询选择器很聪明地使用了分片键前缀的子集来路由查询。

那么全局查询又会是怎样呢?你可以方便地使用explain命令。下面就是一个根据filename字段进行查询的例子,其中既没有用到索引,也没有用到分片键:

selector={filename:"sheet-1"}
db.spreadsheets.find(selector).explain(true)

执行结果如下:


如你所想,该全局查询在两个分片上进行了表扫描,如果查询与你的应用程序相关,你一定想在filename上增加一个索引。无论哪种情况都会搜索整个集群以返回完整结果。一些查询要求并行获取结果集。这就要求在mongos路由器上合并结果。没有索引,这样的额查询会非常低效,并且会屡遭禁止。因此,在下面的查询最近创建的文档的例子里,你就先要创建必要的索引。

db.spreadshetts.ensureIndex({updated_at:1})

正如预期的那样,游标扫描了每个分片的updated_at索引,一次返回最近更新的文档。

更有可能出现的查询时返回某个用户最新修改的文档。同样,你要创建必要的索引,随后发起查询:

db.spreadshetts.ensureIndex({username:1,updated_at:-1})

关于上面的查询计划,有几个需要注意的地方。首先,该查询指向了单个分片。因为你指定了分片键username,所以查询路由器可以找出哪个分片包含了相关的块。随后你就会发现排序并不需要访问所有的分片;当排序查询中包含分片键,所要查询的分片数量通常都能有所减少。

第二个需要注意的地方是分片使用了{username:1,updated_at:-1}索引来执行查询,这说明了一个很重要的内容,即分片集群是如何处理查询的。通过分片键将查询路由给指定分片,一旦到了某个分片上,有分片自行决定使用哪个索引来执行该查询。在为应用程序设计查询和索引时,请牢记这一点。

2. 索引

有时,如果不确定某个查询时怎么解析的,可以试试explain()。通常这都很简单,但是在运行分片集群时,有几点关于索引的内容应该牢记在心,下面会逐个进行说明。

(1)每个分片器维护了自己的索引。这点应该是显而易见的,当你在分片集合上申明索引时,每个分片都会为它那部分集合构建独立的索引。例如,在上一篇博文中,通过mongos发起可db.spreadsheets.ensureIndex()命令,每一个分片都单独处理了索引创建命令。

(2)由此可以得出一个结论,每个分片上的分片集合都应该拥有相同的索引。如果不是这样的话,查询性能会很不稳定。

(3)分片集合只允许在_id字段和分片键上添加唯一性索引。其他地方不行,因为这需要在分片间进行通信,实施起来和复杂,而且相信这么做速度也很慢,没有实现的价值

一旦理解了如何进行查询的路由选择,以及索引时如何工作的,你应该就能针对分片集群写出漂亮的查询和索引了。

Mongo实战-分片集群的查询与索引相关推荐

  1. mongodb分片概念和原理-实战分片集群

    一.分片 分片是一种跨多台机器分发数据的方法.MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署. 问题: 具有大型数据集或高吞吐量应用程序的数据库系统可能会挑战单个服务器的容量.例如 ...

  2. 实战:MongoDB 分片集群Shard Cluster 搭建(1台路由节点,3台配置节点,9台分片节点)

    MongoDB 分片集群搭建(分片集群安全认证+SpringBoot访问) 一.搭建要求 一台路由节点 IP地址:192.168.80.110 端口:11111 三套复制集(每个分片节点中的复制集 都 ...

  3. 【mongo系列】 六、mongo分片集群

    一.简介 1. 分片集群简介 1.分片原因 分片集群是为了解决单节点存在的CPU和存储,IO的瓶颈问题,将原来存储在单个mongo实例中的数据,按照一定的规则分散存储在多个mongo实例中,每个mon ...

  4. mongo 3.4分片集群系列之六:详解配置数据库

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  5. 用mongoshake实现mongo分片集群到单实例和分片集群的数据同步

    一 实验环境 这里演示只同步源端ccc库下的t1,t2表,ddd库下的所有表到两个目标端. 二 实验步骤 2.1 创建专用账号 2.1.1 在源端创建账号 2.1.1.1 登录其中一个mongos节点 ...

  6. mongoDB研究笔记:分片集群的工作机制

    上面的(http://www.cnblogs.com/guoyuanwei/p/3565088.html)介绍了部署了一个默认的分片集群,对mongoDB的分片集群有了大概的认识,到目前为止我们还没有 ...

  7. MongoDb分片集群认证

    本文主要基于已经搭建好的未认证集群,结合上篇Mongodb副本集分片集群模式环境部署(https://www.cnblogs.com/woxingwoxue/p/9875878.html), Mong ...

  8. MongoDB最新4.2.7版本三分片集群修改IP实操演练

    背景 重新组网,需要对现有MongoDB分片集群服务器的IP进行更改,因此也需要对MongoDB分片集群的IP也进行相应的更新,而MongoDB分片集群的IP修改不能单纯的通过配置来进行,需要一番折腾 ...

  9. MongoDB——MongoDB分片集群(Sharded Cluster)两种搭建方式

    MongoDB分片集群(Sharded Cluster)两种搭建方式 MongoDB分片的概念 分片集群包含的组件 分片集群架构目标 MongoDB分片集群搭建 第一套副本集 第二套副本集 配置节点副 ...

最新文章

  1. 浅谈协同工作流的分布式应用
  2. python汉化之后好用吗_买了《Python学习手册(中文第4版)》后悔了
  3. SCSF 系列:Smart Client Software Factory 启动过程详解
  4. 面试官:我想用Nginx提升系统10倍性能,你有哪些建议?
  5. MySQL中的ORDER BY field
  6. python如何计算分子描述符_Python——描述符(descriptor)解密
  7. spring boot 集成mybatis连接oracle数据库
  8. catcti监控linux主机,CentOS7搭建Prometheus 监控Linux主机
  9. Java同步组件之CountDownLatch,Semaphore
  10. MVC3中输出Html标签的方法
  11. Python Tornado web框架简单例子
  12. 483. Smallest Good Base 1
  13. pytest执行时,报report.html错误
  14. SolidWorks修改工程图中文字字体的方法
  15. 随机过程 - 马尔可夫链
  16. 66个求职应聘技巧性问答(一)
  17. leetcode 森林中的兔子
  18. 了解Apache实木复合地板
  19. 开发票服务器返回信息为空,使用 getinvoicebatch 批量接口获取发票信息,返回成功,但数据是空的...
  20. 【Code】Python金字塔模型的实现(Pyramid)

热门文章

  1. win8.1安装vs2015专业版 KB2919335
  2. css行高line-height研究
  3. 微信公众 mysql回复图片_微信公众平台开发消息回复总结介绍
  4. unity image sprite 赋值不显示
  5. 游戏项目和开源项目调研
  6. iOS12网页视频播放点击全屏按钮会导致闪退
  7. Android基础入门视频培训教程-刘志远-专题视频课程
  8. 计算机应用技基础10018,北京关于全国计算机等级考试与自考课程衔接的安排
  9. 科技英语写作句型积累
  10. 黑马程序员HTML+CSS学成在线项目