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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章