在MongoDB中一些坑(最好不要用)

在MongoDB中一些坑(最好不要用)
MonDB目前是一个热门的NoSQL数据库文件,它提供了一些优秀的功能:自动故障转移机制,自动分片,非模态的无模式,在大多数情况下,性能优良。但薄荷遇到了很多在使用过程中存在的问题mondb深度。这里有几个坑,我们见过面。特别声明:我们目前的版本是mondb 2.4.10,已经升级到mondb 2.6.0版,和仍然存在的问题和回2.4.10版本。

mondb数据库级锁

陨石坑指数:5颗恒星(最高的5颗恒星)

mondb锁机制和关系数据库(Oracle,InnoDB InnoDB)有很大的差异,Oracle可以提供锁的粒度,而mondb只能提供基地级粒度的锁,这就意味着当MonDB写锁在被占领的国家,其他的读和写的所有工作等。

看看图书馆的水平锁在并行环境有严重的问题,但mondb依然能够保持高并发、高性能,这是因为锁的粒度mondb虽然很广泛,但在锁机制和关系型数据库的锁有很大的不同,主要表现在:

MonDB没有完整的事务支持操作的原子性只是一个单一的文件,所以它通常是较小的操作粒度;

对mondb锁的实际时间是存储数据的计算和改变的时候,通常很快;

mondb锁已暂时放弃机制。当需要等待慢速IO读取和写入数据时,它可以暂时放弃,然后等待IO再次获取锁。

通常没有问题,并不意味着没有问题,如果数据将导致操作不当,仍长时间占用写锁,如下面提到的索引操作施工,当这一切发生的时候,整个数据库完全堵塞,无法进行任何写操作,情况是很严重的。

解决问题的办法,尽量避免长时间占用写锁操作,如果有一些设置操作是难以避免的,你可以在一个单一的mondb图书馆这本集子,MonDB图书馆不同的锁是相互隔离的,分离的集合可以避免一组操作触发一个全局拥塞问题。

对数据库阻塞建立电缆引导

作弊指数:3

上述问题mondb锁,索引是一种以久的写锁造成的简单问题,需要写在索引建立前锁MonDB(但不放弃当临时),如果大量的数据采集、索引通常需要比较长的时间,特别容易引起问题。

这个解决方案非常简单。mondb提供两种索引访问。一种是背景模式。它不需要占用写锁很长时间。另一种是非后台模式。占用锁需要很长时间。后台的使用可以解决这个问题。例如,为超大型表帖建立索引,不要使用它。

复制代码代码如下所示:

db.posts.ensureindex({ 1 } user_id:)
应该使用

复制代码代码如下所示:

db.posts.ensureindex({ 1 },{ user_id:背景:1 })
正确使用嵌入式嵌入文档

陨石坑指数:5颗恒星

嵌入的文件是一个明显的差异之间的MonDB和关系数据库。它可以将其他子文档嵌入到文档中,使父子文档保存在一个集合中,便于搜索修改

例如,在应用程序场景中有一个组文档。用户申请加入集团模型为grouprequest文件。在开始的时候,我们将把grouprequest组。Ruby代码如下所示(用半群的ORM):

复制代码代码如下所示:

班集体

包括半群::文件



embeds_many:group_requests



终点

类grouprequest

包括半群::文件



embedded_in:组



终点
这样我们就掉进了坑,几乎爬不出来,它导致一次系统的近两周,高峰时段经常有几分钟的卡顿,最严重的甚至停机所造成的mondb。

经过仔细分析,发现一些活性组group_requests增加(当新的应用程序应用)和变化(通过或拒绝用户应用)频繁,这些操作往往需要很长一段时间写锁,导致整个数据库块。原因是,当有group_request手术组增加,足够的预分配空间,需要重新分配空间(内存硬盘是必需的),耗时长,集团还建立在指标很多,导致大量移动位置索引的更新操作非常耗时,造成锁问题,需要很长的时间。

这个问题的答案,它也很简单,就是普通的外键嵌入相关的变化,类似于关系数据库的方法,使group_request增加或修改只发生在GroupRequest,简单、快速,避免长时间占用写锁的问题。当关联对象的数据是不固定的或经常的变化,就要避免使用嵌入的关联,否则会死的很惨。

不合理地使用数组字段

作弊指数:4

对mondb数组字段是一个独特的功能,可以存储一些简单的一对多关系在一个单一的文件。

薄荷醇有一个应用程序场景来使用一个严重的性能问题,直接如下面的代码所示:

复制代码代码如下所示:

类用户

包括半群::文件



现场:follower_user_ids,类型:数组,默认:{ }



终点
用户通过follower_user_ids阵列类型字段保存用户的ID的关注,用户的注意力从10到3000的范围内,变化较为频繁,造成上述问题将是类似的,follower_user_ids频繁修改导致大量长时间数据库写锁,造成在mondb数据库性能急剧下降。

解决问题的办法是,我们将follower_user_ids到内存数据库Redis,避免用户在MonDB的频繁变化,从而彻底解决问题。如果你不使用redis,你也可以设置一个userfollower集与外键关联的形式。

以上几个坑的第一单,是用mondb过程造成无限伤害人的陷阱,我们必须高度重视,避免落入坑。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部