当前位置: 首页 > news >正文

mongo索引构建

声明索引时要小心

由于这个步骤太容易了,所以也很容易在无意间触发索引构建。如果数据集很大,构建会花很长时间。在生产环境里,这简直就是梦魇,因为没办法中止索引构建。如果发生了这种情况,你将不得不故障转移到从节点上——如果有从节点的话。最明智的建议是将索引构建当做某类数据库迁移来看待,确保应用程序的代码不会自动声明索引。

索引的构建分为两步。

第一步,对要索引的值排序。经过排序的数据集在插入到B树时会更高效。注意,排序的进度会以已排序文档数和总文档数的比率来进行显示:

[conn1] building new index on { open: 1.0, close: 1.0 } for stocks.values
    1000000/4308303 23%
    2000000/4308303 46%
    3000000/4308303 69%
    4000000/4308303 92%
    Tue Jan 4 09:59:13 [conn1] external sort used : 5 files in 55 secs

第二步,排序后的值被插入索引中。进度显示方式与第一步相同,完成之后,完成索引构建所用的时间会显示出来,作为插入system.indexes的耗时:

    1200300/4308303 27%
    2227900/4308303 51%
    2837100/4308303 65%
    3278100/4308303 76%
    3783300/4308303 87%
    4075500/4308303 94%
Tue Jan 4 10:00:16 [conn1] done building bottom layer, going to commit
Tue Jan 4 10:00:16 [conn1] done for 4308303 records 118.942secs

还要注意lockType,它说明索引构建用了写锁,也就是说其他客户端此时无法读写数据库。如果发生在生产环境里,这无疑是很糟糕的,这也是长时间索引构建让人抓狂的原因。

后台索引

如果是在生产环境里,经不住这样暂停数据库访问的情况,可以指定在后台构建索引。虽然索引构建仍会占用写锁,但构建任务会停下来允许其他读写操作访问数据库。如果应用程序大量使用MongoDB,后台索引会降低性能,但在某些情况下这是可接受的。例如,假设你知道可以在应用程序流量最低的时间窗口内完成索引的构建,那么这时后台索引会是个不错的选择。

要在后台构建索引,声明索引时需要指定{background: true}。可以像下面这样在后台构建之前的索引:

db.values.ensureIndex({open: 1, close: 1}, {background: true})

离线索引

如果生产数据集太大,无法在几小时内完成索引,这时就需要其他方案了。通常这会涉及让一个副本节点下线,在该节点上构建索引,随后让其上的数据与主节点同步。一旦完成数据同步,将该节点提升为主节点,再让另一个从节点下线,构建它自己的索引。该策略假设你的复制oplog够大,能避免离线节点的数据在索引构建过程中变得过旧。下一章会详细讨论复制,应该能帮你计划这样的迁移过程。

相关文章:

  • 自己用的空气指数实时图的爬虫
  • iOS开发 - 通过NSDate获取年、月、日、星期
  • smarty模板原理
  • python 数组反序的方法
  • 《企业云桌面实施》-小技巧-01-规划注意事项
  • J2SE Base-1
  • mysql零距离接触-存储过程
  • 加速 gradle 编译之屏蔽部分 Task | 掘金技术征文
  • Using Call_Form in Oracle D2k
  • php日志记录类
  • 乐观锁的一种实现方式——CAS
  • 中国科学院大学2014年数学分析高等代数考研试题
  • JavaScript标准库系列——Math对象和Date对象(二)
  • 图像处理中经常用的一幅图片Lena.jpg
  • Git的安装和介绍
  • JavaScript-如何实现克隆(clone)函数
  • 【Leetcode】104. 二叉树的最大深度
  • CentOS7 安装JDK
  • CSS 提示工具(Tooltip)
  • eclipse(luna)创建web工程
  • Javascript设计模式学习之Observer(观察者)模式
  • js中的正则表达式入门
  • php中curl和soap方式请求服务超时问题
  • ViewService——一种保证客户端与服务端同步的方法
  • Vue组件定义
  • 服务器之间,相同帐号,实现免密钥登录
  • 简析gRPC client 连接管理
  • 力扣(LeetCode)56
  • 目录与文件属性:编写ls
  • 如何编写一个可升级的智能合约
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 携程小程序初体验
  • Prometheus VS InfluxDB
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #etcd#安装时出错
  • #单片机(TB6600驱动42步进电机)
  • (003)SlickEdit Unity的补全
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (二)PySpark3:SparkSQL编程
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core 项目指定SDK版本
  • .NET Micro Framework 4.2 beta 源码探析