MongoDB如何在後臺建立索引

chenfeng發表於2016-08-01
預設情況下,MongoDB的ensureIndex()是阻塞型操作,會暫停資料庫上所有正在進行的其他操作,直到建立索引完成。但是,在高於或等於1.3.2版本的MongoDB中,提供了可選的後臺建立索引的選項。
命令如下:
> db.things.ensureIndex({x:1}, {background:true});
> db.things.ensureIndex({name:1}, {background:true, unique:true,... dropDups:true});
當後臺模式啟動時,其他的操作,包含寫,在建立索引期間不會被阻塞。該索引在建立完成前不會被應用到查詢中去。

舉例如下:
> db.chenfeng.find()
{ "_id" : ObjectId("5714419cf7c81959e12a904e"), "age" : 1, "name" : "duansf" }
{ "_id" : ObjectId("571441a3f7c81959e12a904f"), "age" : 2, "name" : "duansf" }
{ "_id" : ObjectId("571441a7f7c81959e12a9050"), "age" : 3, "name" : "duansf" }
{ "_id" : ObjectId("571441abf7c81959e12a9051"), "age" : 4, "name" : "duansf" }
{ "_id" : ObjectId("571442b0f7c81959e12a9052"), "age" : 5, "name" : "duansf" }
{ "_id" : ObjectId("571442bcf7c81959e12a9053"), "age" : 6, "name" : "duansf" }
>
>
> db.chenfeng.ensureIndex({age: 6},{name:"idx_age_6",background:true});         --加入background:true選項
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.chenfeng.getIndexes();
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "chenfeng.chenfeng"
        },
        {
                "v" : 1,
                "key" : {
                        "age" : 6
                },
                "name" : "idx_age_6",
                "ns" : "chenfeng.chenfeng",
                "background" : true
        }
]。
>
注意:
每個集合在同一時刻只允許建立一個索引。
一些管理操作,如repairDatabase,不允許在後臺建立索引期間使用。
(應用到生產環境,應使用)v1.4或者更高版本。

建議使用者在建立索引時,儘量選擇後臺建索引的方式,可能效能上不如前臺方式,但後臺建索引對業務的影響是最小的(前臺建索引還會獲取 db 的寫鎖,導致 db 上的讀寫都被阻塞)。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2122811/,如需轉載,請註明出處,否則將追究法律責任。

相關文章