Mongodb背景索引 - 一旦创建它们仍然是背景吗?

时间:2013-03-22 20:28:30

标签: mongodb indexing mongodb-indexes

在mongodb中创建索引时,可以指定background: true标志,这会导致索引创建为非阻塞。这在生产中很棒,因为您不希望在创建一个之前显然不需要的索引时锁定整个数据库(因为您没有它)。

阅读docs,似乎这个标志只决定了索引的创建方式,一旦构建完毕,索引的行为就像普通索引一样。这就是我想要的 - 我不希望索引与文档不同步,因为它在后台更新,尽管我可以想象一个数据库可以做到这一点。

我在这里问,因为getIndexes命令显示索引仍然标记为background,即使它已创建。这只是提醒它是如何创建的吗?或者background索引在创建后表现不同?也许复制有些微妙?

2 个答案:

答案 0 :(得分:23)

一旦创建,它们就像常规索引一样。他们坚持getIndexes只是提醒,类似于uniquesparse等等。

但它也有其他含义。仅仅因为 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开始,在主服务器的后台创建索引将导致索引在后台创建在辅助服务器上。当主数据库完成构建索引时,辅助数据库将开始创建索引。

还有另一种在生产系统中非常有效地创建索引的方法。这是在用于提供大多数查询的不同服务器上创建索引。比如说,在串联工作的多个数据库服务器的副本集中,可以取出一个,并将请求路由到可用的请求。前台索引创建可以在分离的服务器上完成。创建成功后,可以将其恢复到群集。