在mongodb中创建索引时,可以指定background: true
标志,这会导致索引创建为非阻塞。这在生产中很棒,因为您不希望在创建一个之前显然不需要的索引时锁定整个数据库(因为您没有它)。
阅读docs,似乎这个标志只决定了索引的创建方式,一旦构建完毕,索引的行为就像普通索引一样。这就是我想要的 - 我不希望索引与文档不同步,因为它在后台更新,尽管我可以想象一个数据库可以做到这一点。
我在这里问,因为getIndexes
命令显示索引仍然标记为background
,即使它已创建。这只是提醒它是如何创建的吗?或者background
索引在创建后表现不同?也许复制有些微妙?
答案 0 :(得分:23)
一旦创建,它们就像常规索引一样。他们坚持getIndexes
只是提醒,类似于unique
,sparse
等等。
但它也有其他含义。仅仅因为 foreground 索引阻止了所有编写器,在这种情况下,在创建所有索引之前,您将无法执行db.testCollection.getIndexes()
。同时,当您创建背景索引时,您可以调用db.testCollection.getIndexes()
,您将看到,该索引似乎已经创建。
但在这种情况下,我们无法确定是否实际创建了索引。在这种情况下,您需要致电db.currentOp(),如果您看到类似
的内容{
"inprog": [
{
"opid": 2001060,
"active": true,
"secs_running": 1,
"op": "insert",
"ns": "test.system.indexes",
"insert": {
"v": 1,
"key": {
"a": 1
},
"ns": "test.testCollection",
"name": "a_1",
"background": 1
},
....
"msg": "bg index build Background Index Build Progress: 368640/1000000 36%",
"progress": {
"done": 368640,
"total": 1000000
}
...
}
]
}
那意味着,后台索引的创建仍在进行中,您还可以看到有关该过程的一些信息。
例如,你可以做一些粗略的计算: 1000000中的368640需要1秒(尽可能+1秒),因此一切都需要3-6秒(最终需要4.8秒)。
显然,如果您无法看到正在进行的此类操作,则已创建索引。
注意:如果您有许多并发操作,那么您可以为db.currentOp()
指定searсh参数,例如。
db.currentOp({"insert.background":1})
答案 1 :(得分:0)
有多个索引选项 - 前景(默认)&背景。前景相对较快,它阻止了所有作家和读者。我们仍然可以访问的其他数据库。这应该不是在生产环境中完成的。
后台索引创建有点慢,它们不会阻止读者和编写者。使用MongoDB
2.4及更高版本,您甚至可以在同一数据库上并行创建多个背景索引。
从MongoDB
2.6开始,在主服务器的后台创建索引将导致索引在后台创建在辅助服务器上。当主数据库完成构建索引时,辅助数据库将开始创建索引。
还有另一种在生产系统中非常有效地创建索引的方法。这是在用于提供大多数查询的不同服务器上创建索引。比如说,在串联工作的多个数据库服务器的副本集中,可以取出一个,并将请求路由到可用的请求。前台索引创建可以在分离的服务器上完成。创建成功后,可以将其恢复到群集。