2013-03-22 82 views
15

在mongodb中創建索引時,可以指定background: true標誌,這會使索引創建爲非阻塞狀態。由於您不希望整個數據庫在創建索引時被鎖定,因此您在此之前完全不需要(因爲您沒有這個索引),所以這非常棒。Mongodb背景索引 - 它們在創建後仍然是背景嗎?

docs,它似乎像這個標誌只決定如何創建索引,並且一旦它完成構建索引行爲就像一個正常的索引。這是我想要的 - 我不希望索引與文檔不同步,因爲它在後臺被更新,儘管我可以想象一個數據庫能夠做到這一點。

我在這裏問,因爲getIndexes命令顯示,即使在創建索引後,索引仍然標記爲background。這只是提醒它是如何創建的?或者background索引在創建後行爲有所不同?也許一些微妙的複製?

回答

15

一旦創建它們就像常規索引一樣。他們堅持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 
     } 
     ... 
    } 
    ] 
} 

那麼就意味着,背景創建的索引仍在進行中,而且還可以看到關於該過程的一些信息。

例如,你可以做一些粗略的計算: 368640中的1000000需要1秒(+1秒作爲可能的偏移),因此一切都需要3-6秒(最終花費4.8秒)。

很明顯,如果你看不到這樣的操作正在進行,那麼索引已經被創建。

注意:如果你有很多併發操作,那麼你可以爲db.currentOp() f.e指定searcih參數。

db.currentOp({"insert.background":1}) 
+1

嗯都unqiue和備用,儘管被創建,因爲這樣做也堅持這樣也過去的創作,所以我不知道我得到的第一行。 – Sammaye 2013-03-24 14:43:52

+0

我只是想說,'稀疏','唯一'只是標識符,如果您調用'db.collection.getIndexes()',您可能會看到這些標識符。 F.E.如果您將索引創建爲'sparse',那麼您會在其描述中看到'{sparse:true}'。 ''background','dropDups'和其他參數的行爲也是一樣的。換句話說,所有在'ensureIndex'中作爲第二個參數傳遞的參數都是索引的描述。 – n1ckolas 2013-03-24 15:28:45

+0

我更新了第一段以反映此評論討論。 – Leopd 2013-03-27 18:15:33

0

有多個索引選項 - 前景(默認)&背景。前景相對較快,它阻止了所有的作家和讀者。其他數據庫,我們仍然可以到達。這應該不是在生產環境中完成的。

背景索引創建有點慢,並且不會阻止讀者和作者。使用MongoDB 2.4及更高版本,即使在同一個數據庫上,也可以並行創建多個後臺索引。

MongoDB開始2.6,在主服務器的後臺創建索引會導致在輔助服務器的後臺創建索引。當小學生完成其索引建設時,輔助人員將開始創建索引。

還有另一種在生產系統中非常有效地創建索引的方法。即在用於服務大多數查詢的不同服務器上創建索引。比方說,在一個由多個數據庫服務器組成的副本集合中,可以取出一個,並將請求路由到可用的路徑。前臺索引創建可以在分離的服務器上完成。創建成功完成後,可以將其恢復到羣集。