28

在 mongodb 中创建索引时,可以指定background: trueflag,使索引创建是非阻塞的。这在生产中非常有用,因为您不希望在创建以前显然不需要的索引时锁定整个数据库(因为您没有它)。

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

我在这里问是因为该getIndexes命令显示索引background即使在创建后仍被标记为。这只是一个关于它是如何创建的提醒吗?还是background索引在创建后表现不同?也许复制有一些微妙之处?

4

2 回答 2

26

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

但它也有其他含义。仅仅因为前台索引会阻止所有写入者,在这种情况下,您将无法执行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():如果您有许多并发操作,那么您可以为, fe指定搜索参数

db.currentOp({"insert.background":1})
于 2013-03-24T10:24:04.677 回答
3

有多个索引选项 - 前景(默认)和背景。前台相对较快,它会阻止所有的作者和读者。我们仍然可以访问的其他数据库。这不应该在生产环境中完成。

后台索引创建有点慢,它们不会阻止读取器和写入器。使用MongoDB2.4 及更高版本,您甚至可以在同一个数据库上并行创建多个后台索引。

MongoDB2.6 开始,在主服务器的后台创建索引将导致在辅助服务器的后台创建索引。当主节点完成构建其索引时,辅助节点将开始创建索引。

还有另一种在生产系统中非常有效地创建索引的方法。那就是在用于服务大多数查询的不同服务器上创建索引。比如说,在多个数据库服务器协同工作的副本集中,可以取出一个并将请求路由到可用的服务器。前台索引的创建可以在单独的服务器上完成。创建成功后,可以带回集群。

于 2016-09-04T10:41:02.057 回答