MongoDB优化
2018-11-13 本文已影响0人
c0f81c84743b
- 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}",依旧不会影响性能
-
索引列颗粒越小越好
- 索引列中每个数据的重复数量称为颗粒,也叫索引的基数。
- 在建索引时尽量将数据颗粒小的列放在索引左侧
-