1. 程式人生 > >Mongdb的索引備份

Mongdb的索引備份

目標

  • 理解mongodb建立索引的目的
  • 掌握mongdb建立索引的方式
  • 熟悉mongdb備份和恢復的命令

1 mongodb的索引

知識點

  • 掌握mongodb索引的建立,刪除操作
  • 掌握mongodb檢視索引的方法
  • 掌握mongodb建立聯合索引的方法
  • 掌握mongodb建立唯一索引的方法

1.1 為什麼mongdb需要建立索引

  • 加快查詢速度
  • 進行資料的去重

1.2 mongodb建立簡單的索引方法

  • 語法:

    • db.集合.ensureIndex({屬性:1}),1表示升序, -1表示降序
    • db.集合.createIndex({屬性:1})
    • 上面兩個命令效果等價
  • 具體操作:db.db_name.ensureIndex({name:1})

1.3 建立索引前後查詢速度對比

測試:插入10萬條資料到資料庫中 插入資料:

for(i=0;i<100000;i++){db.t255.insert({name:'test'+i,age:i})}

建立索引前:

db.t1.find({name:'test10000'})
db.t1.find({name:'test10000'}).explain('executionStats')

建立索引後:

db.t255.ensureIndex({name:1})
db.t1.find({name:'test10000'}).explain('executionStats')

前後速度對比

1.4 索引的檢視

預設情況下_id是集合的索引

檢視方式:db.collection_name.getIndexes()

新增索引前:

> db.test2000.insert({"name":"hello",age:20})
WriteResult({ "nInserted" : 1 })
> db.test2000.find()
{ "_id" : ObjectId("5ae0232f625b9ddd91a0e7ae"), "name" : "hello", "age" : 20 }
> db.test2000.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test2000.test2000"
    }
]

新增name為索引後:

> db.test2000.ensureIndex({name:1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
> db.test2000.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test2000.test2000"
    },
    {
        "v" : 2,
        "key" : {
            "name" : 1
        },
        "name" : "name_1",
        "ns" : "test2000.test2000"
    }
]

1.5 mongodb建立唯一索引

在預設情況下mongdb的索引欄位的值是可以相同的,僅僅能夠提高查詢速度

新增唯一索引的語法:

db.collection_name.ensureIndex({"name":1},{"unique":true})

使用普通索引的效果如下:

> db.test2000.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test2000.test2000"
    },
    {
        "v" : 2,
        "key" : {
            "name" : 1
        },
        "name" : "name_1",
        "ns" : "test2000.test2000"
    }
]
> db.test2000.insert({name:"hello",age:40})
WriteResult({ "nInserted" : 1 })
> db.test2000.find()
{ "_id" : ObjectId("5ae0232f625b9ddd91a0e7ae"), "name" : "hello", "age" : 20 }
{ "_id" : ObjectId("5ae02421625b9ddd91a0e7af"), "name" : "hello", "age" : 30 }
{ "_id" : ObjectId("5ae02432625b9ddd91a0e7b0"), "name" : "hello", "age" : 40 }

新增age為唯一索引之後:

> db.test2000.createIndex({age:1},{unique:true})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 2,
    "numIndexesAfter" : 3,
    "ok" : 1
}
> db.test2000.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test2000.test2000"
    },
    {
        "v" : 2,
        "key" : {
            "name" : 1
        },
        "name" : "name_1",
        "ns" : "test2000.test2000"
    },
    {
        "v" : 2,
        "unique" : true,
        "key" : {
            "age" : 1
        },
        "name" : "age_1",
        "ns" : "test2000.test2000"
    }
]
> db.test2000.insert({"name":"world",age:20})
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 11000,
        "errmsg" : "E11000 duplicate key error collection: test2000.test2000 index: age_1 dup key: { : 20.0 }"
    }
})

1.6 刪除索引

語法:db.t1.dropIndex({'索引名稱':1})

> db.test2000.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test2000.test2000"
    },
    {
        "v" : 2,
        "key" : {
            "name" : 1
        },
        "name" : "name_1",
        "ns" : "test2000.test2000"
    },
    {
        "v" : 2,
        "unique" : true,
        "key" : {
            "age" : 1
        },
        "name" : "age_1",
        "ns" : "test2000.test2000"
    }
]
> db.test2000.dropIndex({age:1})
{ "nIndexesWas" : 3, "ok" : 1 }
> db.test2000.dropIndex({name:1})
{ "nIndexesWas" : 2, "ok" : 1 }
> db.test2000.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test2000.test2000"
    }
]

1.7 建立複合索引

在進行資料去重的時候,可能用一個欄位來保證資料的唯一性,這個時候可以考慮建立複合索引來實現。

例如:抓全貼吧資訊,如果把帖子的名字作為唯一索引對資料進行去重是不可取的,因為可能有很多帖子名字相同

建立複合索引的語法:db.collection_name.ensureIndex({欄位1:1,欄位2:1})

> db.test2000.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test2000.test2000"
    }
]
> db.test2000.createIndex({name:1,age:1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
> db.test2000.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test2000.test2000"
    },
    {
        "v" : 2,
        "key" : {
            "name" : 1,
            "age" : 1
        },
        "name" : "name_1_age_1",
        "ns" : "test2000.test2000"
    }
]

1.8 建立索引注意點

  • 根據需要選擇是否需要建立唯一索引
  • 索引欄位是升序還是降序在單個索引的情況下不影響查詢效率,但是帶複合索引的條件下會有影響

    例如:在進行查詢的時候如果欄位1需要升序的方式排序輸出,欄位2需要降序的方式排序輸出,那麼此時複合索引的建立需要把欄位1設定為1,欄位2設定為-1

2 mongodb的備份和恢復

知識點

  • 掌握mongdb的備份和恢復命令

2.1 備份

備份的語法:mongodump -h dbhost -d dbname -o dbdirectory

  • -h: 伺服器地址, 也可以指定端⼝號
  • -d: 需要備份的資料庫名稱
  • -o: 備份的資料存放位置, 此⽬錄中存放著備份出來的資料

示例:mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

2.2 恢復

恢復語法:mongorestore -h dbhost -d dbname --dir dbdirectory

  • -h: 伺服器地址
  • -d: 需要恢復的資料庫例項
  • --dir: 備份資料所在位置

示例:mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

3 動手

  1. 嘗試將我電腦中的douban.tv1中的資料恢復到自己的電腦中,具體如何操作?

  2. 完成上述操作後完成以下問題:

    2.1.獲取每條資料中的title,count(所有評分人數),rate(評分),country(國家)的這些欄位

    2.2.獲取上述結果中的不同國家電視劇的資料量

    2.3.獲取上述結果中分數大於8分的不同國家電視劇的資料量