mongdb的索引及備份
阿新 • • 發佈:2018-12-15
1. 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()[ {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.6 建立複合索引
在進行資料去重的時候,可能用一個欄位來保證資料的唯一性,這個時候可以考慮建立複合索引來實現。 例如:抓全貼吧資訊,如果把帖子的名字作為唯一索引對資料進行去重是不可取的,因為可能有很多帖子名字相同 建立複合索引的語法: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.7 建立索引注意點
- 根據需要選擇是否需要建立唯一索引
-
索引欄位是升序還是降序在單個索引的情況下不影響查詢效率,但是帶複合索引的條件下會有影響
例如:在進行查詢的時候如果欄位1需要升序的方式排序輸出,欄位2需要降序的方式排序輸出,那麼此時複合索引的建立需要把欄位1設定為1,欄位2設定為-1
2. mongodb的備份和恢復
知識點-
掌握mongdb的備份和恢復命令
2.1 備份
備份的語法:mongodump -h dbhost -d dbname -o dbdirectory - -h: 伺服器地址, 也可以指定端⼝號
- -d: 需要備份的資料庫名稱
- -o: 備份的資料存放位置, 此⽬錄中存放著備份出來的資料
2.2 恢復
恢復語法:mongorestore -h dbhost -d dbname --dir dbdirectory- -h: 伺服器地址
- -d: 需要恢復的資料庫例項
- --dir: 備份資料所在位置