左手MongoDB(MongoDB的优化和安全建议)
一、提高MongoDB读写性能
1、“批量插入”与“逐条插入”数据,比较性能差异
批量插入数据的性能远远超过逐条插入数据性能
2、“插入”与“更新”数据,比较性能差异
对于必须逐条更新大量数据的情况,也可以使用插入代替更新来提高性能
3、使用“索引”提高查询速度

原理比较
举例:在集合one_by_one申,要查询所有"salary" 字段大于1000的记录。
如果没有对salay添加索引,那么MongoDB就会一条一条地检查, 如果"salary"大于10000 就记录下来。直到把所有记录遍历完,然后输出所有满足“salary"大于100的记录。
如果为“salary"添加了索引,那么MongoDB在创建索引的过程中就会对“salary”的值进行排序,索引默认是升序。有了索引后,MongoDB的查询会先从索引中寻找,于是就能大大提高速度。
创建索引
import pymongo
handler = pymongo.MongoClient().chapter_8.one _by_one
handler.create_index('salary',background = True)
其中第3行代码,对"salary" 字段创建索引。background可以为True或者为False。
- 如果为False,那在创建索引时,这个集合就不能被查询也不能被写入,但是速度快。
- 如果设置为True,那么创建索引的速度会慢一些,但是不影响其他程序读写这个集合。
对一个字段添加索引以后,千万量级的数据在一秒内就可以查询出结果。
对一个字段,索引只需要添加一次,之后插入的新数据MongoDB都会自动处理。
索引是以空间换时间。集合中的数据越多,索引占用的硬盘空间
就越多。所以,只对必要的字段添加索引,不要对所有字段都添加索引。
_id默认自带索引, 不需要添加。
4、引入Redis,以降低MongoDB的读取频率
5、增添适当冗余信息,以提高查询速度
二、提高MongoDB的安全性
1、配置权限管理机制
MongoDB默认没有账号和密码,只要连上了它就可以查询、修改、增加、删除任何内容。
为了增强MongoDB的安全性,需要配置基于角色的访问控制(Role-Based Acces Cotrol,RBAC)机制。
RBAC机制涉及三个关键定义:角色(Roles)、特权(Privileges)和用户(Users)。
- 特权是指一些资源和能够在资源上进行的操作。
- 一个角色可以有多种特权。
- 一个用户可以被赋予不同的角色。
(1)、创建管理员用户
管理员用户的作用是创建其他用户。管理员用户本身不能对数据库进行控制。
use admin
db.createUser(
{ user:'admin',
pwd:'123456',
roles:[{role:'userAdminAnyDatabase',db:'admin'}]
})

mongod.conf添加
security:
authorization: enabled
重启,再次连接客户端
show dbs

查询不到数据集
mongo -port 27017 -u "admin" -p "123456" --authenticationDatabase "admin"

查询成功
(2)创建普通用户
db.createUser(
{
user : "test_name",
pwd : "123456",
roles: [ { role : "readWrite", db : "chapter_8" } ,
{ role : "read", db : "chapter_7" } ]
}
)

(3)使用Robo 3T连接有账号的MongoDB

编辑连接


(4)创建能操作数据库的管理员用户
管理员(admin账号)能创建其他用户,看似权限非常大,但它不能访问任何一个数据库。
所以,如果有必要,还需要创建一个能对所有数据库都有全部权限的用户。

db.createUser(
{
user : "root",
pwd : "123456",
roles: ['root']
}
)


(5)用Python连接有密码的MongoDB
mongobd://用户名:密码@数据库地址:端口/数据库名
如果使用root用户,不用指定数据库
2、开放外网访问
修改mongod.conf
