问题 在mongodb中哪些操作便宜/昂贵?


我正在阅读MongoDB,并试图了解它最适合的地方。我没有看到明确答案的一个问题是哪些操作便宜或昂贵,以及在什么条件下。

你能帮忙澄清一下吗?

谢谢。


4918
2017-12-19 13:50


起源



答案:


人们经常声称,mongodb写得非常快。虽然它们确实不慢,但这是一种夸大其词。 mongodb中的写吞吐量受全局写锁限制。是的,你说得对,只有 * 在任何给定时刻在服务器上发生写操作。

另外,我建议你利用mongodb的无模式特性并将数据存储为非规范化。通常只有一个磁盘可以获取所有需要的数据(因为它都在同一个文档中)。减少磁盘搜索 - 更快的查询。

如果数据位于RAM中 - 根本不需要磁盘搜索,则直接从内存中提供数据。所以,确保你有足够的RAM。

的Map / Reduce$哪里 查询很慢。

写一篇大文件并不快(使用 $push, 例如)。该文档将超出其磁盘边界,必须复制到另一个地方,这涉及更多的磁盘操作。

我同意@AurelienB,一些基本原则在所有数据库中都是通用的。


更新

*自2011年以来,mongodb的几个主要版本被发布,改进了锁定的情况(从服务器级到数据库级到集合级)。引入了一个新的存储引擎WiredTiger,它具有文档级锁。总而言之,2018年的写作现在应该明显加快。


5
2017-12-19 14:14



我听到你说的是“mongodb有非常快速的个人写入,但锁定系统一次限制你一个。”这是否适用于分片? - Abe
不,分片可以缓解这个问题。每个分片都有自己的锁。 - Sergio Tulentsev


答案:


人们经常声称,mongodb写得非常快。虽然它们确实不慢,但这是一种夸大其词。 mongodb中的写吞吐量受全局写锁限制。是的,你说得对,只有 * 在任何给定时刻在服务器上发生写操作。

另外,我建议你利用mongodb的无模式特性并将数据存储为非规范化。通常只有一个磁盘可以获取所有需要的数据(因为它都在同一个文档中)。减少磁盘搜索 - 更快的查询。

如果数据位于RAM中 - 根本不需要磁盘搜索,则直接从内存中提供数据。所以,确保你有足够的RAM。

的Map / Reduce$哪里 查询很慢。

写一篇大文件并不快(使用 $push, 例如)。该文档将超出其磁盘边界,必须复制到另一个地方,这涉及更多的磁盘操作。

我同意@AurelienB,一些基本原则在所有数据库中都是通用的。


更新

*自2011年以来,mongodb的几个主要版本被发布,改进了锁定的情况(从服务器级到数据库级到集合级)。引入了一个新的存储引擎WiredTiger,它具有文档级锁。总而言之,2018年的写作现在应该明显加快。


5
2017-12-19 14:14



我听到你说的是“mongodb有非常快速的个人写入,但锁定系统一次限制你一个。”这是否适用于分片? - Abe
不,分片可以缓解这个问题。每个分片都有自己的锁。 - Sergio Tulentsev


根据我的实践,应该提到的一件事是,mongodb不太适合报告,因为通常在报告中你需要来自不同馆藏的数据('加入')和mongodb没有提供聚合数据的好方法多个集合(并且不应该提供)。对于某些报告肯定是map / reduce或 增加的 map / reduce可以很好地工作,但很少见。

对于报告,有些人建议将数据迁移到关系数据库中,这些数据库有很多报告工具。


4
2017-12-19 15:35



Mongodb现在加入: $查找。 - Sergio Tulentsev


这与所有数据库系统没有太大区别。

对索引数据的查询很快。对很多数据的查询都很慢。 由于非规范化,如果没有索引,在基础上写入会很快,这就是为什么日志记录是基本用例的原因。

相反,当你有数十亿的文档时,读取没有索引的磁盘(不在RAM中)的数据可能会非常慢。


1
2017-12-19 14:03