为什么在MongoDB中索引的方向很重要

为什么在MongoDB中索引的方向很重要


杨__羊羊
浏览 759回答 2
2回答

阿波罗的战车

MongoDB以某种方式连接复合密钥,并将其用作BTree中的密钥。在找到单个项目时-树中节点的顺序无关。如果要返回一系列节点-相互靠近的元素将沿着同一棵树的枝条向下移动。节点在此范围内越近,其检索速度就越快。单字段索引-命令不重要如果它们在提升顺序上接近在一起,它们也将以降序紧密地在一起。当你有一个复合钥匙-命令开始起作用了。例如,如果键为A升序B,索引可能如下所示:Row A B1 1 12 2 63 2 7 4 3 45 3 56 3 67 5 1对A、升序B降序的查询将需要跳过索引,以返回行,并且速度更慢。例如,它将返回行1, 3, 2, 6, 5, 4, 7与索引相同的Range查询将按正确的顺序顺序返回行。在BTree中查找记录需要O(log(N))时间。按顺序查找记录范围仅为OLog(N)+k,其中k是要返回的记录数。

POPMUISE

mongodb在前台直接运行建立索引命令的话,将造成整个数据库阻塞,因此索引建议使用 background 的方式建立。但是这也会带来一定的问题,在2.6 版本之前,在 secondary server 中即使使用 background 方式建立索引,secondary 还是会以foreground 方式建立索引,它导致 secondary 同样引发数据库阻塞问题。2.6 版本修复了这个 Bug,2.6 版之后使用background 方式建立索引时,真正转向后台运行了。为了尽量降低建立索引对 MongoDB Server 的影响,有一种方法是把 MongoDB Server 转换成 standalone 模式后建立。具体做法如下:1.首先把 secondary server 停止,在取消 --replSet 参数,并且更改 MongoDB port 之后重新启动 MongoDB,这时候 MongoDB 将进入 standalone 模式;2.在 standalone 模式下运行命令 ensureIndex 建立索引,建议使用 foreground 方式运行;3.建立索引完毕之后关闭 secondary server 按正常方式启动;4.根据上述 1~3 的步骤轮流为 secondary 建立索引,最后把 primary server 临时转换为 secondary server,同样按 1~3 的方法建立索引,再把其转换为 primary server。这种方式还是比较麻烦的,但可以把建立索引操作对 MongoDB 的影响降到最低,在有些情况下还是值得做的。 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MongoDB