MongoDB优化

  • MongoDB优缺点概述:
    • 经济的横向扩展,以增加分区的方式将数据库拆成不同的区块,来分布到不同的机器。
    • 脱离了横向扩展的弊端管理困难的问题
  • NoSQL的设计方式:操作数据灵活
  • 预设计模式、动态模式
    • 预设计模式:
      • 传统数据库设计
      • 需要对数据库表中的字段名称、字段类型进行规定。插入不符合设计的数据会失败
    • 动态模式:
      • 动态追加,在创建时不会对数据类型进行限定
  • 范式化与反范式化
    • 范式化:将数据分散到不同表,利用关系模型进行关联
      • 优点:方便增、删、改,后期修改不会影响与其关联的数据
    • 反范式化:将当前文档的数据集中放在本表
      • 优点:查询性能高
    • 完全分离(范式化设计)
      • 更新效率高、查询效率低
    • 完全嵌套(范范式化设计)
      • 查询效率高、更新效率低
    • 部分内嵌(折中)
  • 性能、用户量
    • 成反比
    • 页面加载10S,用户会离开
  • 填充因子:
    • MongoDB为文档扩展预留的增长空间
    • 文档的移动非常消耗性能,频繁移动会增加系统负担
    • 实际开发中最可能让文档体积变大的因素是数组
    • 如果文档会频繁修改并增大空间,需要考虑填充因子
    • 两种方案:
      • 增加初始分配空间

        • usePowerOf2Sizes属性,为true时,系统会将后续插入的文档,初始空间分配为2的N次方
        • 适用于会频繁变更的集合
        • 会给每个文档留有更大空间,但空间的分配会变低效,如果集合在更新时不会频繁移动,会导致写入速度相对变慢
      • 利用数据强行将初始分配空间扩大

        “stuff”: “ggggggggggggggggggggggggggggggggggggggggggg"

      • 对这个文档进行增长式修改时,删掉此字段即可,字段名、值随意添加

  • 准确利用索引
    • 索引越少越好
      • 建立索引,系统会添加一个索引表,用于索引指定的列,但如果对已建立的索引的列进行插入或修改,数据库就需要对原来的索引表进行重新排序,很消耗性能
    • 隐式索引:如果想要排序的字段包含在已建立的复合索引中,则无需重复建立索引
      例:建立复合索引
       db.test.ensureIndex({"age": 1,"no": 1,"name": 1 })
       db.test. find().sort("age": 1,"no": 1)
       db.test.find().sort("age": 1)
      
    • 翻转索引:在排序查询时无需考虑索引列的方向

      db.test.ensureIndex({“age”: 1})

      • 例如这个例子中我们在查询时可以将排序条件写为"{‘age’: 0}",依旧不会影响性能
    • 索引列颗粒越小越好
      • 索引列中每个数据的重复数量称为颗粒,也叫索引的基数。
      • 在建索引时尽量将数据颗粒小的列放在索引左侧
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值