使用MongoDB开发过程常见错误分析

  • 时间:
  • 浏览:2

关于双精度浮点格式详情,还前要参考:

问題描述:

关于要怎样设计片键,还前要参考:

b). 与否还前要建立复合索引,复合索引字段要怎样组织顺序,都还可不可以 使得复合索引都都还可不可以 覆盖更多的查询需求,满足范围查询的需求,满足排序的需求(通常复合索引中,按照等值查询、排序、范围查询的顺序来组织索引字段,一齐结合考虑索引取舍性,与否有些查询能复用复合索引的左前缀)。索引与否能覆盖查询,使得检索性能最优。

分析:

要怎样让 mongo shell实际上是三个 多多js引擎,而在javascript中,基本类型中并这样int或long,所有整数字面量实际上都以双精度浮点数表示(IEEE754格式)。64位的双精度浮点数中,实际是由1bit符号位,11bit的阶码位,52bit的尾数位构成。

11bit的余-1023阶码使得双精度浮点数提供最少-1.7E808~+1.7E808的范围,52bit的尾数位最少能表示15~16位数字(每项16位长的整数要怎样让 超出52bit能表示的范围)。

另外,好多好多 在查询时使用project操作,只返回前要的元素和字段,而全部都会整个内嵌数组,以免浪费下行带宽 。

当然,最好和最安全的正确处理方案,是通过MongoDB企业版提供的后台管理工具,比如ops manager进行全量备份,实时增量备份。

a)《双精度浮点数格式》:

有丰沛 项目中应用MongoDB经验,熟悉MongoDB相互模式设计及性能优化,熟悉大数据相关技术和互联网及大数据应用分类整理。

当然,要怎样让 存储的元素数量有限,且不想对其进行有些僵化 的操作,使用内嵌数组将是很好的措施,它还前要减少检索次数,提升读操作性能。

d). 检查亲们儿设计的索引与否有重复索引、无用索引,与否缺失索引。比如复合索引要怎样让 能覆盖有些单字段索引。业务查询调整等意味 ,有些索引要怎样让 不再使用。通过慢查询日志,发现有些查询这样索引,严重影响系统性能。及时删除重复的、不再使用的索引,为严重影响性能的查询补上最少的索引。

在亲们儿的业务场景中,通常都一齐有插入(insert)数据和更新(update)数据的需求,好多好多 之后,亲们儿无法判断正要写入的数据与否要怎样让 所处于数据库中,对于这个具体情况,MongoDB为update操作提供了upsert选项,使得亲们儿在三个 多多操作中能自动正确处理上述具体情况,即当数据库不所处写入数据时,执行insert操作,当数据库要怎样让 所处写入数据,则执行update操作。(不过,这里要注意,要怎样让 并发操作,亲们儿要怎样让 会一齐对相同数据执行upsert操作,此时要怎样让 会造成写入数据重复。为了正确处理这个具体情况,应该对upsert操作的query字段建立唯一索引进行约束)。

a). 使用随机值类型的字段作为片键,累似 于version 4 UUID (Random UUID)

MongoDB Ops Manager:

https://www.mongodb.com/products/ops-manager

要怎样让 有技术能力的,还前要通过结合参考Mongo Shake,MongoSync等开源同步克隆好友工具 (注意全部都会备份),实现我本人的实时增量备份工具。

片键使用自增长字段

c). 通过explain查看执行计划,判断亲们儿的查询和排序与否都都还可不可以 用上索引,与否用上亲们儿预期那个最合理的索引。

使用NumberLong()函数构造长整型的包装类型,记住传入的参数一定要加双引号,要怎样让 使用整数字面量一句话又会被当做double而要怎样让 丢失精度。

问題描述:

参考:

使用ObjectId或时间戳等具有自增长性质(不想说一定是严格自增长,大致趋势符合也行)的值类型作为分片集合片键时,新写入数据的请求始终都路由到同三个 多多分片节点。

问題描述:

b)《数据库索引设计和优化》,这本书觉得比较老,还是非常值得参考。

但好多好多 之后,即使亲们儿都都还可不可以 在写入之后分辨数据是插入还是更新,但要怎样让 应用多多线程 员“懒”这个形状,都会仍然对所有写操作使用update(upsert=true),而全部都会区分的使用insert和update。

首先,亲们儿要充分了解数据库索引设计的有些原则和技巧。

但实际上查询发现,插入的123456789111111111变为另外三个 多多值12345678911111180,如下:

b)《编程卓越之道-第一卷:深入理解计算机》- 第4章 浮点表示法

问題描述:

a). 哪些字段的检索需求,与否有范围查询需求,与否有排序需求,前要检索字段的取舍性要怎样。将哪些需求和数据具体情况一一列出,为亲们儿后续创建索引提供措施。

对查询的数组使用投影(project)操作:

https://docs.mongodb.com/manual/tutorial/project-fields-from-query-result

正确处理措施:

分析:

好多好多 当亲们儿在mongo shell中直接使用整数字面量时,实际上它是以double表示的,而当这个整数字面量最少超过16位数字时,就要怎样让 所处有些整数无法精确表示的具体情况,这样使用三个 多多接近能表示的整数来替代。如底下例子中,存入18位的数字123456789111111111,实际还前要有效表示的数字这样16位,另外两位所处精度丢失的具体情况。

Mongo Shake:

https://github.com/aliyun/mongo-shake

MongoSync:

https://github.com/Qihoo380/mongosync

https://docs.mongodb.com/manual/reference/method/db.collection.update/#upsert-parameter

问題描述:

a)MongoDB索引介绍:

参考:

滥用upsert更新参数

不加区分的使用upsert,觉得僵化 了亲们儿应用多多线程 的书写逻辑,要怎样让 要怎样让 也带来了写入性能的损失。upsert操作在写入前都会先根据查询条件检索一次,判断后再进行操作,一齐为了正确处理并发写入意味 重复数据,还前要对query的字段建立唯一索引进行约束,写入时维护索引的开销,进一步降低了写入性能。作者在之后的开发中测试过,不加区分的使用upsert和加以区分的使用insert、update两种具体情况,性能相差差不要 1倍。

问題描述:

分析:

(本文讨论在社区交流群以及工作开发过程中常见的有些错误。)

BBD技术经理,资深架构师。MongoDB中文社区联席主席。

参考:

片键使用自增长字段,意味 写热点

a). upsert参数:

如下图,MongoDB使用片键的范围来对数据分区,每个范围(连续且不重叠),对应三个 多多数据块(Chunk)。要怎样让 当片键是自增长类型时,插入的数据实际上全部都会落在三个 多多Chunk存储的范围内,意味 所有写入请求都路由到这个Chunk所在的分片,从而意味 这个节点成为写热点,写负载这样均衡的分担到集群中的多个分片节点,从而丧失了通过分片集群横向扩展写性能的意义。

内嵌文档/数组的数据模型:

问題描述:

应用多多线程 里游标循环迭代过程中进行长时间的操作

Mongo shell中使用大整数字面量

正确处理措施:

正确处理措施:

a)《深入学习MongoDB》- 3.1节 取舍片键

正确处理措施:

b) .对自增长型字段创建哈希索引,创建片键时通过hashed选项,指定使用该哈希索引值作为片键,累似 于:

Mongo shell中使用大整数字面量,但默认整数字面量类型却是双精度浮点数,意味 丢失精度

https://docs.mongodb.com/manual/indexes/index.html

但问題是,首先,在MongoDB中文档有大小限制,目前版本中每个文档最大这样超过16M,好多好多 使用内嵌文档存储无法满足粉丝或关注好友增长的需求,大用户节点要怎样让 要怎样让 有几瓶粉丝或关注用户,超过16M,届时应用多多线程 将真难扩展。其次,面对排重,排序,过滤筛选等有些僵化 需求,使用数组存储将意味 操作僵化 ,性能低下。

https://docs.mongodb.com/manual/core/data-model-design/#data-modeling-embedding

迭代游标:

https://docs.mongodb.com/manual/tutorial/iterate-a-cursor/#read-operations-curso

注意,除了在mongo shell(javascript语言环境中),在有些不支持长整型而默认使用浮点数代替表示的编程语言中也会所处累似 于问題,操作时一定要留意。

最少累似 于如下代码描述的操作措施,应用多多线程 中要怎样让 时不还会遇到这样 的需求,取出三个 多多文档后,前要对这个文档做有些比较耗时的僵化 正确处理。

分析:

正确处理措施:

游标介绍:

https://docs.mongodb.com/manual/reference/method/db.collection.find/index.html

错误的认为克隆好友等于备份

错误的设计索引

在MongoDB服务器端,也会为相应查询维护三个 多多游标对象,游标会消耗内存和有些资源(比如锁,CPU等)。

通常,亲们儿开发中遇到的大每项读性能问題,要怎样让 全部都会要怎样让 这样为查询、排序操作建立索引,要怎样让 建立了错误的索引意味 的。特别是在数据量比较大的具体情况,要怎样让 这样利用上索引,意味 全表扫描,数据库前要从磁盘读取几瓶数据到缓存,占用几瓶的内存,磁盘IO,CPU等系统资源,要怎样让 对哪些资源的争用,一齐也要怎样让 会影响到期间进行的写入操作。

参考:

本文主要讨论这十多少 问題:

正确处理措施:

查询内嵌数组:

https://docs.mongodb.com/manual/tutorial/query-arrays/https://docs.mongodb.com/manual/tutorial/query-array-of-documents/

另外,即使是高可用架构,99.999%的高可用性,但你也要怎样让 命中注定是那0.001%的倒霉蛋。

慎用upsert参数,当亲们儿在写入前还前要区分数据与否要怎样让 所处数据库中时,在应用多多线程 中进行判断,区分的使用insert和update操作。

通过克隆好友实现的高可用架构,不想说能代替备份操作。当亲们儿误操作,要怎样让 误操作后这样及时正确处理时(即使在副本集中通过延迟节点留给亲们儿有些缓冲时间),副本也会同步哪些误操作,意味 数据受到破坏,要怎样让 此时亲们儿这样备份数据,数据将无法恢复,从而要怎样让 带来无法正确处理的后果。

正确处理措施:

要怎样让 好多好多 同学误解了高可用和克隆好友,将其作用等同于备份,从而忽视了备份的重要性,甚至意味 数据丢失无法恢复的后果,跑路事件时有所处。

错误的设计索引

滥用数组类型

游标这样在遍历完了所有查询的结果之后,要怎样让 客户端主动发来消息要求终止(比如到达游标使用超时时间,默认是10分钟,要怎样让 是客户端检测到客户端游标要怎样让 不再使用时),MongoDB才会销毁游标,释放其占用的资源,好多好多 亲们儿应该尽快释放游标,特别是当亲们儿的系统面对的是互联网应用这样 高并发的业务场景时,亲们儿应该尽要怎样让 的不想说浪费数据库端资源,基本原则应该做到减少占用时间,不想前要尽快关闭游标。

MongoDB备份工具介绍:

https://docs.mongodb.com/manual/core/backups/index.html

错误的认为克隆好友等于备份

分析:

将某个用户的粉丝要怎样让 关注好友,保所处该用户文档的数组字段中,觉得这样 设计形状看似很直观,在读取时也很高效,一次检索就还前要将该用户的基本信息及其粉丝和关注好友都取出来。

分析:

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

滥用数组类型

在社区的讨论群中,时不还会有同学讨论使用MongoDB实现累似 于微博的关注和粉丝功能,考虑用数组来保存关注好友要怎样让 粉丝。

b)《片键 – 搭建MongoDB分片集群之关键》:

http://www.mongoing.com/blog/post/on-selecting-a-shard-key-for-mongodb

好多好多 ,一定要备份,一定要备份,一定要备份。

其次,结合业务中对数据的检索需求,设计最少的索引:

MongoDB提供了副本集的部署模式,通过主从的克隆好友分类整理,从节点通过克隆好友主节点的数据,为数据提供了多个副本,要怎样让 通过选举机制,在主节点挂掉后,自动选举三个 多多从节点成为新的主节点,实现自动故障转移,保证系统的高可用性。

滥用upsert更新参数

按需而取,通过查询过滤条件,limit措施,尽量限制游标迭代文档数量。

通过mongo shell插入或更新三个 多多大整数(长度约大于等于16位数字)时,累似 于:

参考:

大每项业务场景,通常亲们儿不想说前要在迭代游标过程中完成哪些正确处理操作,要怎样让 是这样 ,亲们儿还前要累似 于如下正确处理,尽快的迭代游标,将数据提交给队列让另外的应用多多线程 异步正确处理,以便能尽快释放游标连接:

在使用数组前,亲们儿应该充分评估,结合数组的形状,从业务的读写场景、将来的扩展、查询写入性能、操作维护与否简单等各方面考虑数组与否真的满足亲们儿的需求,不想说盲目的进行数据形状设计和开发。