一、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 表名
規律:
- 每個表導出2個文件,分別是bson結構的數據文件和json結構的索引信息
- 如果不聲明表名, 導出所有的表
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()