资讯专栏INFORMATION COLUMN

mongo索引构建

Salamander / 3161人阅读

摘要:在生产环境里,这简直就是梦魇,因为没办法中止索引构建。最明智的建议是将索引构建当做某类数据库迁移来看待,确保应用程序的代码不会自动声明索引。索引的构建分为两步。如果发生在生产环境里,这无疑是很糟糕的,这也是长时间索引构建让人抓狂的原因。

声明索引时要小心

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

索引的构建分为两步。

第一步,对要索引的值排序。经过排序的数据集在插入到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够大,能避免离线节点的数据在索引构建过程中变得过旧。下一章会详细讨论复制,应该能帮你计划这样的迁移过程。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18930.html

相关文章

  • mongo的密集索引与稀疏索引

    摘要:密集索引的索引默认都是密集型的。也就是说,在一个有索引的集合里,每个文档都会有对应的索引项,哪怕文档中没有被索引键也是如此。稀疏索引在稀疏索引里,只会出现被索引键有值的文档。这种情况下密集型索引并不适合,你所需要的是稀疏索引。 密集索引 mongo的索引默认都是密集型的。也就是说,在一个有索引的集合里,每个文档都会有对应的索引项,哪怕文档中没有被索引键也是如此。例如,电子商务数据模型里...

    Invoker 评论0 收藏0
  • MongoDB 资源、库、工具、应用程序精选列表中文版

    摘要:推荐阅读资源库工具应用程序精选列表中文版有哪些鲜为人知,但是很有意思的网站一份攻城狮笔记每天搜集上优秀的项目一些有趣的民间故事超好用的谷歌浏览器油猴插件合集目录资源文档文章图书会谈教程更多库工具管理数据部署桌面发展监控应用资源文档介绍文档教 推荐阅读 MongoDB 资源、库、工具、应用程序精选列表中文版 有哪些鲜为人知,但是很有意思的网站? 一份攻城狮笔记 每天搜集 Github ...

    e10101 评论0 收藏0
  • MongoDB入门

    摘要:一个数据集中只能创建一个全文索引。圆形,使用表示。的提高会导致的提高导致明显的性能问题。 mongo数据模型 文档与集合 文档是mongo的核心概念,本质是是一种BSON(Binary JSON)数据,BSON是一种类JSON的二进制数据,可以在为JSON基础上添加了一些新的数据类型,包括日期、Int32、Int64,常被作为数据存储和网络数据交换的格式,缺点是空间利用率并不理想(存在...

    call_me_R 评论0 收藏0
  • php + MongoDB + Sphinx 实现全文检索

    摘要:此文成于年月现状目前的稳定版本为目前对英文等字母语言采用空格分词故其对中文分词支持不好目前官方中文分词方案仅支持按单字分词在基础上目前国内有两个中文分词解决方案一个是一个是没有官网文档较少可查到的最新版本可支持官方还在维护但貌似不打 NOTE : 此文成于 2017 年 3 月. 现状: Sphinx 目前的稳定版本为 2.2.11.Sphinx 目前对英文等字母语言采用空格分词,故...

    Simon_Zhou 评论0 收藏0
  • php + MongoDB + Sphinx 实现全文检索

    摘要:此文成于年月现状目前的稳定版本为目前对英文等字母语言采用空格分词故其对中文分词支持不好目前官方中文分词方案仅支持按单字分词在基础上目前国内有两个中文分词解决方案一个是一个是没有官网文档较少可查到的最新版本可支持官方还在维护但貌似不打 NOTE : 此文成于 2017 年 3 月. 现状: Sphinx 目前的稳定版本为 2.2.11.Sphinx 目前对英文等字母语言采用空格分词,故...

    dockerclub 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<