四、schema 设计原则1.需要关注MongoDB的自身的特性
要清楚了解MongoDB的基本数据单元 。在关系型数据库中有带列和行的数据表 。而MongoDB数据的基本单元是BSON文档,在键值中有指向不定类型值的键,MongoDB拥有即时查询,但不支持联结操作,简单的键值存储只能根据单个键来获取值,不支持事务,但支持多种原子更新操作 。
2.需要关注系统本身的读写特性
如读写比是怎样的,需要何种查询,数据是如何更新的,会不会存在什么并发问题,数据结构化的程度是要求高还是低 。系统本身的需求决定mysql还是MongoDB 。
3.关注MongoDB schema 的设计模式
- 内嵌与引用 :当子对象总是出现在父对象的上下文中时,使用内嵌文档;否则将子对象单独存一个集合 。
- 一对多的关系 :在“多”的集合关系中添加id指向依赖的id 。
- 多对多 :在其中一种对应关系中使用对象数组指向另外一个对象 。
- 树 :具化路径,在树中的每个节点都包含一个path字段,该字段具体保存了每个节点祖先的id 。
- 动态属性 :可以为不同的动态属性添加索引,如果需要将属性圈在一个范围,那么可以通过key-value的方式,然后在统一的key上面加索引 。
- 关于事务 :如果需要事务支持,那么只能选择另一种数据库,或者提供补偿性事务来解决事务的问题 。
- 不能创建没用的索引
- 不能在同一个字段中存不同的类型
- 不能把多类实体都放在一个集合里 不能创建体积大、嵌套深的文档
- 不能过多的创建集合,集合、索引、数据库的命名空间都是有限的
- 不能创建无法分片的集合
(1)关注数据库的概念
数据库是集合的逻辑与物理分组,MongoDB没有提供创建数据库的语法,只有在插入集合时,数据库才开始建立 。创建数据库后会在磁盘分配一组数据文件,所有集合、索引和数据库的其他元数据都保存在这些文件中,查阅数据库使用磁盘状态可通过 。
db.stats()(2)关注集合概念
集合是结构上或概念上相似得文档的容器,集合的名称可以包含数字、字母或 . 符号,但必须以字母或数字开头,完全 。
限定集合名不能超过128个字符,实际上 . 符号在集合中很有用,能提供某种虚拟命名空间,这是一种组织上的原则,和其他集合是一视同仁的 。在集合中可以使用 。
system.namespaces //查询当前数据库中定义的所有命名空间system.indexes //存储当前数据库的所有索引定义(3)关注文档
其次是键值,在MongoDB里面所有的字符串都是UTF-8类型 。数字类型包括double、int、long 。日期类型都是UTC格式,所以在MongoDB里面看到的时间会比北京时间慢8小时 。整个文档大小会限制在16m以内,因为这样可以防止创建难看的数据类型,且小文档可以提升性能,批量插入文档理想数字范围是10~200,大小不能超过16MB 。
五、索引与查询优化1.索引的经验法则
(1)索引能显著减少获取文档的所需工作量,具体的对比可以通过 .explain()方法进行对比
(2)解析查询时MongoDB通过最优计划选择一个索引进行查询,当没有最适合索引时,会先不同的使用各个索引进行查询,最终选出一个最优索引做查询
(3)如果有一个a-b的复合索引,那么仅针对a的索引是冗余的
(4)复合索引里的键的顺序是很重要的
2.索引类型
(1)单键索引
(2)复合索引
(3)唯一性索引
(4)稀疏索引
如索引的字段会出现null的值,或是大量文档都不包含被索引的键 。
3.索引的构建问题
如果数据集很大时,构建索引将会花费很长的时间,且会影响程序性能,可通过
db.currentOp() //查看索引的构建时间当使用 mongorestore 时会重新构建索引 。当曾经执行过大规模的删除时,可使用
db.values.reIndex() 对索引进行压缩,重建 。
4.识别慢查询
(1)查阅慢查询日志
grep -E '([0-9])+ms' mongod.log //使用grep 命令 识别命令信息db.setProfillingLevel(2) //使用解刨器,将记录每次的读写到日志db.setProfillingLevel(1) //只记录慢(100ms)操作(2)分析慢查询
db.values.find({}).sort({close:-1}).limit(1).explain()
- scanOrder 字段表明没有使用索引
- cursor当没有索引时,用的是BasicCursor,当使用索引时使用的是BtreeCursor
推荐阅读
- 腾讯会员怎么取消自动续费
- 躺平是什么意思
- 绿茶有几种,其功效是什么?
- 淘宝直播间人气怎么能上升 淘宝直播怎么才能把人气做起来
- 梦见便秘自己抠出来了 梦见便秘是什么意思
- 昙花的花期是什么时候 昙花的花期是多长时间
- 世界上最高的果树是什么 世界上有多少种水果树
- 冬天开空调还需要盖被子吗 开空调盖被子是什么心理
- 违章停车贴条怎么处理,处罚多少钱 违章停车被贴条没写金额怎么处理
- 花小猪打车怎么看不到车牌 用花小猪打车看的到司机的车牌号码吗