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

Leo*_*opd 23 indexing mongodb mongodb-indexes

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

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

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

n1c*_*las 24

一旦创建,它们就像常规索引一样.他们坚持getIndexes只是作为一个提醒,类似于如何unique,sparse等等做.

但它也有其他含义.仅仅因为前景索引阻止所有编写器,在这种情况下,在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
      }
      ...
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

那意味着,后台索引的创建仍在进行中,您还可以看到有关该过程的一些信息.

例如,你可以做一些粗略的计算:1000000中的368640需要1秒(尽可能+1秒),因此一切都需要3-6秒(最终需要4.8秒).

显然,如果您无法看到正在进行的此类操作,则已创建索引.

注意:如果你有许多并发操作,那么你可以为db.currentOp()fe 指定searсh参数

db.currentOp({"insert.background":1})
Run Code Online (Sandbox Code Playgroud)