一、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()