我们都知道重要的是有一个合适的索引数据库中为了有效地完成其工作。我们已经在我们的日常生活中使用索引进口日常任务,没有索引所有任务将但是在相对较长时间完成。
指数的基本工作
想象我们有大量的信息,我们要看一些非常特别的,我们也不知道它在哪里。我们要花大量的时间发现特定的数据。
如果只有我们一些信息将所有的数据,工作很快就会完成,因为现在我们知道没有花太多时间去哪里看每个记录搜索一个特定的数据。
索引是特殊的数据结构存储一些信息的特定数据记录遍历。可以按升序或降序创建索引来支持高效的平等匹配和基于范围查询操作。
索引构建策略和考虑
当我们想到建立一个索引必须考虑许多方面像关键数据集是经常被使用,基数,编写收集的比例,空闲内存和存储。
如果没有索引的集合,MongoDB将做一个完整的收集扫描每次执行任何类型的查询可能包含数百万条记录。这将不仅减缓行动,还将增加其他操作的等待时间。
我们还可以创建多个指标在同一时间在同一个集合,节省大量的时间是花在扫描的集合方法createindex命令。

限制
是非常重要的有足够的内存来容纳工作集。没有必要所有索引需要适应在RAM中。
索引键限制应小于1024字节到v4.0。与流量控制阀v4.2 4.2开始,这个极限。
与索引名称相同,它可以在db 127字节流量控制阀4.0甚至更低。这个极限降低4.2 db v4.2和流量控制阀。
只有64个索引可以创建在任何单一的集合。
在MongoDB中索引类型
在看到各种指数类型之前,让我们看看索引名称的样子。
的默认名称索引的连接索引键和索引中的每个键的方向(即1或1)使用下划线作为分隔符。例如,创建一个索引{手机:1,分:1}有名字mobile_1_points_-1。
我们也可以创建一个自定义,更可读名称
|
1
|
db
. product
.createIndex
(
{
移动
:
1
,
点
:
- - - - - -
1
}
,
{
的名字
:
“奖励点查询”
}
)
|
索引类型
MongoDB提供各种类型的索引来支持各种数据和查询。
单一的字段索引:在单字段索引,索引是在文档上创建一个字段。它可以在两个方向遍历不管排序顺序在创建索引。
语法:
|
1
|
db
。
集合
。
方法createIndex
(
{
“& lt; fieldName>”
:
&
lt
;
1
或
- - - - - -
1
&
gt
;
}
)
|
这里1表示字段中指定升序降序和1。
例子:
|
1
|
db
。
库存
。
方法createIndex
(
{
productId
:
1
}
)
;
|
复合索引:在复合索引,我们可以创建多个字段上的索引。字段的顺序列在一个复合指数的意义。例如,如果一个复合指数组成{userid: 1,分数:1},该指数排序第一的用户标识然后,在每个用户标识值,排序分数。
语法:
|
1
|
db
。
集合
。
方法createIndex
(
{
&
lt
;
field1
&
gt
;
:
&
lt
;
1
/- - - - - -1
&
gt
;
,
&
lt
;
field2
&
gt
;
:
&
lt
;
1
/- - - - - -1
&
gt
;
,
…
}
)
|
例子:
|
1
|
db
。
学生
。
方法createIndex
(
{
用户标识
:
1
,
分数
:
- - - - - -
1
}
)
|
多键索引:MongoDB使用多键索引索引的内容存储在数组中。当我们创建一个索引字段,其中包含一个数组值,MongoDB将自动创建一个单独的索引数组的每个元素。我们不需要显式地指定多键的类型,如MongoDB自动照顾是否创建一个多键索引如果索引字段包含一个数组的值。
语法:
|
1
|
db
。
集合
。
方法createIndex
(
{
&
lt
;
field1
&
gt
;
:
&
lt
;
1
/- - - - - -1
&
gt
;
}
)
|
例子:
|
1
|
db
。
学生
。
方法createIndex
(
{
“addr.zip”
:
1
}
)
|
地理空间索引:MongoDB提供了两种特殊的索引:2 d索引当返回结果,利用平面几何2 dsphere索引利用球面几何学返回结果。
语法:
|
1
|
db
。
集合
。
方法createIndex
(
{
&
lt
;
位置
场
&
gt
;
:
“2 dsphere”
}
)
|
* <位置字段>是一个字段的值是GeoJSON对象或一双遗留协调。
例子:
|
1
|
db
。
的地方
。
方法createIndex
(
{
疯狂的
:
“2 dsphere”
}
)
|
文本索引:与文本索引类型,MongoDB支持搜索字符串集合中的内容。只有集合一个文本搜索索引,但指数可以覆盖多个领域。
语法:
|
1
|
db
。
集合
。
方法createIndex
(
{
&
lt
;
field1
&
gt
;
:
文本
}
)
|
例子:
|
1
|
db
。
评论
。
方法createIndex
(
{
评论
:
“文本”
}
)
|
散列索引:MongoDB创建散列值的哈希索引字段的基础指标。这种类型的指数主要是必需的,我们想要一个更数据分布e。g的碎片集群环境。
语法:
|
1
|
db
。
集合
。
方法createIndex
(
{
_id
:
“散列”
}
)
|
从4.4版本开始,复合散列索引适用
属性
唯一索引:当指定,MongoDB将拒绝重复的索引字段的值。它将不允许插入另一个文档,其中包含相同的索引的键-值对。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29日
30.
31日
32
33
34
35
36
|
&
gt
;
db
。
cust_details
。
方法createIndex
(
{
Cust_id
:
1
}
,
{
独特的
:
真正的
}
)
{
“createdCollectionAutomatically”
:
真正的
,
“numIndexesBefore”
:
1
,
“numIndexesAfter”
:
2
,
“ok”
:
1
}
&
gt
;
db
。
cust_details
。
插入
(
{
“Cust_id”
:
“39772”
,
“批”
:
“342”
}
)
WriteResult
(
{
“nInserted”
:
1
}
)
&
gt
;
db
。
cust_details
。
插入
(
{
“Cust_id”
:
“39772”
,
“批”
:
“452”
}
)
WriteResult
(
{
“nInserted”
:
0
,
“writeError”
:
{
“代码”
:
11000年
,
“errmsg”
:
“E11000重复键错误集合:学生。cust_details在dex: Cust_id_1 dup key: { Cust_id: \"39772\" }"
}
}
)
|
部分指标:部分索引只指数符合筛选条件的文档。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
db
。
餐厅
。
方法createIndex
(
{
菜
:
1
,
的名字
:
1
}
,
{
partialFilterExpression
:
{
评级
:
{
美元
gt
:
5
}
}
}
)
{
“createdCollectionAutomatically”
:
真正的
,
“numIndexesBefore”
:
1
,
“numIndexesAfter”
:
2
,
“ok”
:
1
}
|
TTL索引:TTL索引是特殊单字段索引,可用于汽车从集合中删除文档超过一段时间。
|
1
2
3
|
db
。
事件日志
。
方法createIndex
(
{
“lastModifiedDate”
:
1
}
,
{
expireAfterSeconds
:
3600年
}
)
lastModifiedDate_1
|
稀疏索引:稀疏索引文件只包含条目索引字段,即使索引字段包含null值。
|
1
2
3
|
db
。
地址
。
方法createIndex
(
{
“电子邮件”
:
1
}
,
{
稀疏的
:
真正的
}
)
email_1
|
隐藏的索引:隐藏的索引是不可见的查询计划,不能用于支持查询。除了对规划师隐藏,隐藏的索引像进行索引。
创建一个新的隐藏指数:
|
1
|
db
。
地址
。
方法createIndex
(
{
pincode
:
1
}
,
{
隐藏的
:
真正的
}
)
;
|
改变现有的索引一个隐藏的一个(只能db有流量控制阀4.4或更高版本):
|
1
2
3
|
db
。
地址
。
hideIndex
(
{
pincode
:
1
}
)
;
/ /指定索引键规范文档
或
db
。
地址
。
hideIndex
(
“pincode_1”
)
;
/ /指定索引名称
|
取消隐藏任何隐藏的指数:
索引名称或关键可以用来隐藏指数。
|
1
2
3
|
db
。
地址
。
unhideIndex
(
{
pincode
:
1
}
)
;
/ /指定索引键规范文档
或
db
。
地址
。
unhideIndex
(
“pincode_1”
)
;
/ /指定索引名称
|
滚动索引建立在副本集
从MongoDB4.4后,索引构建所有data-bearing节点上同时发生。不能容忍的工作负载的性能问题由于索引构建,我们可以遵循滚动索引构建的方法策略。
* *注意* *
唯一索引
使用下列程序创建唯一索引,你必须停止所有写入集合在这个过程。
如果你不能停止所有写入集合在这个过程中,不使用这个页面上的过程。相反,建立唯一索引的集合通过发行db.collection.createIndex()在主副本集。
Oplog大小
确保你oplog足够大以允许索引或重新操作完成没有落后太多。
过程
1。停止并重新启动一个二级作为一个独立的在一个不同的端口号。
在这个过程中,我们要停止任何一个辅助节点和禁用的复制参数配置文件,和disableLogicalSessionCacheRefresh真正的在配置文件中setParameter下部分。
例子
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
净
:
bindIp
:
本地主机
,
&
lt
;
主机名
(
年代
)
|
知识产权
地址
(
西文
)
&
gt
;
港口
:
27217年
#端口:27017
#复制:
# replSetName: myRepl
setParameter
:
disableLogicalSessionCacheRefresh
:
真正的
|
我们只需要在上面的设置进行更改,将其余部分保持不变。
一旦上述更改完成,保存它并重新启动的过程。
|
1
|
mongod
- - -
配置
&
lt
;
路径
/
来
/
ConfigFile
&
gt
;
|
或
|
1
|
sudo
systemctl
开始
mongod
|
现在,mongod过程将在独立模式开始在端口27217上。
2。建立索引
连接到mongod实例在端口27217上。切换到所需的数据库和收集来创建索引。
例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
蒙戈
- - - - - -港口
27217年
- - - - - -
u
”用户名”- - - - - -authenticationDatabase
管理
&
gt
;
使用
学生
切换
来
db
学生
&
gt
;
db
。
studentData
。
方法createIndex
(
{
StudentID
:
1
}
)
;
{
“createdCollectionAutomatically”
:
真正的
,
“numIndexesBefore”
:
1
,
“numIndexesAfter”
:
2
,
“ok”
:
1
}
|
3所示。重新启动过程mongod作为一个副本集合成员
所需的索引构建完成之后,我们可以添加节点回replicaset成员。
撤销上述变更配置文件中作出的第一步。重新启动mongod过程与原来的配置文件。
|
1
2
3
4
5
6
7
8
9
|
净
:
bindIp
:
本地主机
,
&
lt
;
主机名
(
年代
)
|
知识产权
地址
(
西文
)
&
gt
;
港口
:
27017年
复制
:
replSetName
:
myRepl
|
保存配置文件之后,重新启动的过程,让它成为次要的。
|
1
|
mongod
- - -
配置
&
lt
;
路径
/
来
/
ConfigFile
&
gt
;
|
或
|
1
|
sudo
systemctl
开始
mongod
|
4所示。对其余辅助重复上述过程
一旦当前的节点成为中等和没有滞后,再次重复这个过程一个节点。
- 停止并重新启动一个二级作为一个独立的。
- 建立索引。
- 重新启动mongod过程作为副本集合成员。
5。索引建立在主
一旦索引构建活动结束所有的次要节点,使用相同的过程与上面的最后一个节点上创建一个索引。
- 连接到主节点和问题rs.stepDown ();一旦成功下台,就二次和一个新的主当选。遵循步骤从一个到三个构建索引。
- 停止并重新启动辅助节点作为一个独立的。
- 构建iondex。
- 重新启动mongod过程作为副本集合成员。
滚动指数基于分片集群
从MongoDB4.4后,索引构建所有data-bearing节点上同时发生。不能容忍的工作负载的性能问题由于索引构建,我们可以遵循滚动索引构建的方法策略。
* *注意* *
唯一索引
使用下列程序创建唯一索引,你必须停止所有写入集合在这个过程。
如果你不能停止所有写入集合在这个过程中,不使用这个页面上的过程。相反,建立唯一索引的集合通过发行db.collection.createIndex()在主副本集。
Oplog大小
确保你oplog足够大以允许索引或重新操作完成没有落后太多。
过程
1。停止均衡器
为了创建一个索引碎片集群以滚动的方式,有必要停止均衡器,这样我们不得到不一致的指数。
连接到蒙戈实例并运行sh.stopBalancer ()禁用均衡器。
如果有任何积极的迁移,完成后平衡器只会停止正在进行的迁移。
我们可以检查是否平衡器停止使用下面的命令,
|
1
|
上海
。
getBalancerState
(
)
|
如果停止均衡器,输出将是错误的。
2。确定集合的分布
为了建立索引以滚动的方式,有必要知道的碎片集合居住。
连接到一个蒙戈和刷新缓存,这样我们买新鲜分布信息的碎片集合在我们想要构建索引。
例子:
我们想要创建一个索引在studentData收集学生数据库。
我们将运行以下命令来重新分布的集合。
|
1
|
db
。
adminCommand
(
{
flushRouterConfig
:
“students.studentData”
}
)
;
|
|
1
|
db
。
记录
。
getShardDistribution
(
)
;
|
我们将得到包含收集碎片的输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
碎片
shardA
在
shardA
/
s1
- - - - - -
mongo1
。
净
:
27018年
,
s1
- - - - - -
mongo2
。
净
:
27018年
,
s1
- - - - - -
mongo3
。
净
:
27018年
数据
:
1简约
文档
:
50
块
:
1
估计
数据
每
块
:
1简约
估计
文档
每
块
:
50
碎片
shardC
在
shardC
/
s3
- - - - - -
mongo1
。
净
:
27018年
,
s3
- - - - - -
mongo2
。
净
:
27018年
,
s3
- - - - - -
mongo3
。
净
:
27018年
数据
:
1简约
文档
:
50
块
:
1
估计
数据
每
块
:
1简约
估计
文档
每
块
:
50
总数
数据
:
3简约
文档
:
One hundred.
块
:
2
碎片
shardA
包含
50
%
数据
,
50
%
文档
在
集群
,
avg
obj
大小
在
碎片
:
40 b
碎片
shardC
包含
50
%
数据
,
50
%
文档
在
集群
,
avg
obj
大小
在
碎片
:
40 b
|
从上面的输出,我们可以看到,学生。studentDataexist on shardA and shardC and we need to build indexes on shardA and shardC, respectively.
3所示。构建包含集合块碎片上的索引
遵循下面的步骤在每个碎片,其中包含集合的一部分。
3.1。停止并重新启动一个二级作为一个独立的
确定碎片,停止的一个次要节点,并进行以下更改。
- 改变不同的端口的端口号
- 注释掉复制参数
- 注释掉切分参数
- 下一节“setParameter”添加skipShardingConfigurationChecks:真正的和disableLogicalSessionCacheRefresh:真正的
例子
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
|
净
:
bindIp
:
本地主机
,
&
lt
;
主机名
(
年代
)
|
知识产权
地址
(
西文
)
&
gt
;
港口
:
27218年
#端口:27018
#复制:
# replSetName: shardA
#分片:
# clusterRole: shardsvr
setParameter
:
skipShardingConfigurationChecks
:
真正的
disableLogicalSessionCacheRefresh
:
真正的
|
保存配置后重新启动的过程
|
1
|
mongod
- - -
配置
&
lt
;
路径
/
来
/
ConfigFile
&
gt
;
|
或
|
1
|
sudo
systemctl
开始
mongod
|
3.2。建立索引
连接到mongod实例运行在独立模式和启动索引构建过程。
在这里,我们正在构建学生收集领域的指数StudentID升序排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
&
gt
;
db
。
学生
。
方法createIndex
(
{
StudentID
:
1
}
)
{
“createdCollectionAutomatically”
:
真正的
,
“numIndexesBefore”
:
1
,
“numIndexesAfter”
:
2
,
“ok”
:
1
}
|
3.3。重新启动MongoDB过程replicaset节点
索引构建活动完成后,关闭该实例并重新启动与原配置,删除参数skipShardingConfigurationChecks:真正的和disableLogicalSessionCacheRefresh:真正的
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
净
:
bindIp
:
本地主机
,
&
lt
;
主机名
(
年代
)
|
知识产权
地址
(
西文
)
&
gt
;
港口
:
27018年
复制
:
replSetName
:
shardA
分片
:
clusterRole
:
shardsvr
|
保存配置后重新启动的过程
|
1
|
mongod
- - -
配置
&
lt
;
路径
/
来
/
ConfigFile
&
gt
;
|
或
|
1
|
sudo
systemctl
开始
mongod
|
3.4。重复其余的过程中学的碎片
一旦节点的索引构建已经完成,添加回replicaset集,并与其他节点同步,重复上面的过程从3.1到3.3在其余节点。
3.1。停止并重新启动一个二级作为一个独立的
3.2。建立索引
3.3。重新启动MongoDB过程replicaset节点
3.5。索引建立在主
一旦索引构建活动结束所有的次要节点,使用相同的过程与上面的最后一个节点上创建一个索引。
- 连接到主节点和问题rs.stepDown ();一旦成功下台,变得次要,新的主要是由选举产生。遵循步骤从一个到三个构建索引。
- 停止并重启它作为一个独立的二级节点
- 建立索引
- 重新启动过程mongod副本集合成员
4所示。重复其他碎片的影响
一旦索引构建完成的碎片,开始下一个第三步中概述的过程确定碎片。
5。重新启动均衡器
一旦我们完成了识别构建索引所有碎片我们可以再次启动均衡器。
连接到一个分片中的蒙戈实例集群,并运行sh.startBalancer ()
|
1
|
上海
。
startBalancer
(
)
|
结论
基于一个访问模式和选择正确的键有一个好的指数比拥有多个坏索引。所以,明智地选择你的指数。
还有其他有趣的博客https://www.雷竞技下载官网percona.com/blog/这可能会对你有用。
我也推荐和使用雷竞技下载官网MongoDB Percona服务器,它提供了MongoDB企业级功能没有任何许可(因为它是免费的)。你可以了解更多关于它的博客MongoDB:为什么你支付企业当开源覆盖吗?
雷竞技下载官网等MongoDB Percona还提供了一些更伟大的产品雷竞技下载官网为MongoDB Percona备份,雷竞技下载官网Percona运营商对MongoDB,和其他的技术和工具raybetapp2下载 ,raybet52 ,雷竞技下载官网Percona运营商,和raybetapp官方下载 。




