为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨__羊羊 2019-03-06 05:05:56
为什么在MongoDB中索引的方向很重要
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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是要返回的记录数。



查看完整回答
反对 回复 2019-03-16
?
POPMUISE

TA贡献1765条经验 获得超5个赞

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 的影响降到最低,在有些情况下还是值得做的。

 


查看完整回答
反对 回复 2019-03-16
  • 2 回答
  • 0 关注
  • 753 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信