美文网首页
左手MongoDB(MongoDB的优化和安全建议)

左手MongoDB(MongoDB的优化和安全建议)

作者: 羋学僧 | 来源:发表于2021-08-23 11:15 被阅读0次

    一、提高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

    相关文章

      网友评论

          本文标题:左手MongoDB(MongoDB的优化和安全建议)

          本文链接:https://www.haomeiwen.com/subject/adokiltx.html