MongoDB數據庫(二)--索引,導入導出,複製集

一、MongoDB

(一)索引

  • 索引提高查詢速度,降低寫入速度,權衡常用的查詢字段,不必在太多列上建索引
  • 在mongodb中,索引可以按字段升序/降序來創建,便於排序
  • 默認是用btree來組織索引文件,2.4版本以後,也允許建立hash索引

1.btree索引

在這裏插入圖片描述

2.hash索引

在這裏插入圖片描述

Hash檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節點到枝節點,最後才能訪問到數據節點這樣多次的IO訪問,所以 Hash 索引的查詢效率要遠高於B-Tree 索引。

hash索引缺點

1.Hash 索引僅僅能滿足"=",“IN"和”<=>"查詢,不能使用範圍查詢。

2.Hash 索引無法被用來避免數據的排序操作。

由於 Hash 索引中存放的是經過 Hash 計算之後的 Hash 值,而且Hash值的大小關係並不一定和 Hash 運算前的鍵值完全一樣,所以數據庫無法利用索引的數據來避免任何排序運算;

3.Hash 索引不能利用部分索引鍵查詢。

​ 對於組合索引,Hash 索引在計算 Hash 值的時候是組合索引鍵合併後再一起計算 Hash 值,而不是單獨計算 Hash 值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,Hash 索引也無法被利用。

4.Hash 索引在任何時候都不能避免表掃描。

​ Hash 索引是將索引鍵通過 Hash 運算之後,將 Hash運算結果的 Hash 值和所對應的行指針信息存放於一個 Hash 表中,由於不同索引鍵存在相同 Hash 值,所以即使取滿足某個 Hash 鍵值的數據的記錄條數,也無法從 Hash 索引中直接完成查詢,還是要通過訪問表中的實際數據進行相應的比較,並得到相應的結果。

5.Hash 索引遇到大量Hash值相等的情況後性能並不一定就會比B-Tree索引高。

常用命令

1.查看當前索引狀態:db.collection.getIndexes()

2.創建普通單列索引:db.collection.ensureIndex({field:1/-1})//1爲正序,-1爲逆序

3.刪除單個索引:db.collection.dropIndex({field:1/-1})

4.刪除所有索引:db.collection.dropIndexes(),但_id索引不會被刪除

5.創建多列索引:db.collection.ensureIndex({field1:1/-1,field2:1/-1})

​ 多列索引的使用範圍更廣,因爲一般情況下,我們都是通過多個字段來進行查詢數據的,這時候單列索引其實用不到。

​ 兩個列一起建立索引其實就是將兩個列綁定到一起,來創建索引。

6.子文檔索引:

插入兩條帶子文檔的數據

db.shop. insert({name: 'N0kia' , SPC: {weight: 120 , area: ' taiwan ' } } ) ;
db.shop. insert({name: 'sanxing ' , SPC :{weight: 100 , area: 'hanguo'} } ) ;

查詢出產地在臺灣的手機

db.shop.find({'spc.area':'taiwan'})

給子文檔加索引

db.shop.ensureIndex({'spc.area':1})

7.唯一索引:{unique:true}

db.collection.ensureIndex({field:1/-1},{unique:true})

8.創建稀疏索引:{sparse:true}

特點:如果針對field列做索引,針對不含field的列的文檔,將不建立索引,與之相對,普通索引,會把該文檔的field列的值認爲null,並建立索引。

db.collection.ensureIndex({field:1/-1},{sparse:true})

9.hash索引

db.collection.ensureIndex({field:'hashed'})

(二)導入導出

通用選項

-h host   主機
--port port    端口
-u username 用戶名
-p passwd   密碼

mongoexport導出

-d  庫名
-c  表名
-f  field1,field2...列名
-q  查詢條件
-o  導出的文件名
--type csv  導出csv格式(便於和傳統數據庫交換數據,強制要求必須規定字段)

1.整體導出成json文件

mongoexport -d shop -c goods -o goods.json

在這裏插入圖片描述
在這裏插入圖片描述

2.只導出goods_id,goods_name列

mongoexport -d shop -c goods -f goods_id,goods_name -o goods.json

在這裏插入圖片描述

_id不指定也會導出

在這裏插入圖片描述

3.只導出價格低於1000元的行

mongoexport -d shop -c goods -q {shop_price:{$lt:1000}} -o goods.json

在這裏插入圖片描述

4.導出一個csv文件

mongoexport -d shop -c goods -f goods_name,shop_price -o goods.csv --type csv

在這裏插入圖片描述

可用excel打開
在這裏插入圖片描述

mongoimport導入

-d 待導入的數據庫
-c 待導入的表(不存在會自己創建)
-f 字段
--type  csv(必須指定字段)/json(默認)
--file 備份文件路徑

1.導入json

mongoimport -d shop -c goods_1 --file ./goods.json

在這裏插入圖片描述
在這裏插入圖片描述

2.導入csv

mongoimport -d shop -c goods_2 --type csv --file ./goods.csv -f goods_id,shop_price

在這裏插入圖片描述
在這裏插入圖片描述

mongodump導出二進制bson結構數據及其索引信息

-d  庫名
-c  表名

規律

  1. 每個表導出2個文件,分別是bson結構的數據文件和json結構的索引信息
  2. 如果不聲明表名, 導出所有的表
mongodump -d shop -c goods

在這裏插入圖片描述
在這裏插入圖片描述

mongorestore 導入二進制文件

-d 數據庫
-c 集合
--dir 指定文件夾

導入

mongorestore -d shop -c goods_3 --dir ./dump/shop/goods.bson

在這裏插入圖片描述

(三)replaction複製集

一般情況下,我們通常在機器上安裝了一個數據庫,這時我們的數據都是存在這個數據庫中,如果有一天,因爲一些不可控因素導致數據庫宕機或者數據庫的文件丟失,此時損失就很大了。針對於這種問題,我們希望有一個數據庫集,在我們其中一個數據庫進行插入的時候,其他數據庫可以同步數據,這樣其中一臺服務器崩潰了,也能夠使我們的數據正常存取。

在MongoDB中,是通過replaction複製集來實現此功能的。

步驟

1.創建三個存儲數據庫的文件夾,用來保存數據文件
在這裏插入圖片描述

2.將之前開啓的服務關閉

3.打開三個cmd窗口,分別啓動三個mongodb

mongod --dbpath C:\MongoDB\Server\3.4\data\db1 --logpath C:\MongoDB\Server\3.4\data\logs\db1.log --port 27017 --replSet rs
mongod --dbpath C:\MongoDB\Server\3.4\data\db2 --logpath C:\MongoDB\Server\3.4\data\logs\db2.log --port 27018 --replSet rs
mongod --dbpath C:\MongoDB\Server\3.4\data\db3 --logpath C:\MongoDB\Server\3.4\data\logs\db3.log --port 27019 --replSet rs

在這裏插入圖片描述

其中的–replSet就表示創建的數據集的名稱,必須指定相同的名稱纔可以。

4.新打開一個cmd,進入27017客戶端,進行配置

var rsconf = {
	_id:'rs',
	members:[
		{_id:0,host:'127.0.0.1:27017'},
		{_id:1,host:'127.0.0.1:27018'},
		{_id:2,host:'127.0.0.1:27019'}
	]
}

在這裏插入圖片描述

這時候我們可以打印rsconf來看一下
在這裏插入圖片描述

5.將配置初始化

rs.initiate(rsconf)

在這裏插入圖片描述

使用

在這裏插入圖片描述

需要執行rs.slaveOk()才能查看數據
在這裏插入圖片描述
在這裏插入圖片描述

刪除

rs.remove('127.0.0.1:27019')

刪除節點後,如果想再添加,必須重新配置纔可以

查看數據庫集

rs.status()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章