我在MySQL中有一个包含10个表的数据库。 这些表之间存在复杂的映射。现在我想将相同的数据库迁移到MongoDB。 我在MongoDB中为它创建了一个示例数据库。数据库中的映射使文档变得复杂。
假设表中有100,00行,并且在MySQL中使用3或4个表进行映射,对于MongoDB,单个文档的数据量将很大。 关于同样的问题我几乎没有问题 -
答案 0 :(得分:0)
我根据我在mongoDB上的3年经验来回答这个问题。
最大可能的收集尺寸
在MongoDB中,数据库中的maximum possible size为32TB。如果您认为自己的收藏会超出此限制,那么您应该考虑sharding。
更新文档
即使您有数百万个文档提供了适当的索引设置,MongoDB也可以很好地执行更新。您需要考虑更新的另一件事是,如果您的更新将大幅改变文档的大小,那么mongoDB需要将此文档移动到另一个内存位置。如果同时进行此类更新,则会降低性能。但是,如果您的应用程序有很多这样的更新操作,那么您需要为您的集合设置适当的填充因子。这可以按照here所述完成。请注意,填充因子仅在您使用MMAPv1存储引擎时适用。
<强>锁定强>
您必须注意mongoDB不支持事务,它提供文档级别的ACID属性,而不是集合级别。根据最新版本的MongoDB(v3.0.x),它提供了文档级锁定。 MongoDB数据库中描述了一整页项目,解释了mongodb中的锁定。链接here。多个线程只有在获得写锁定后才能更新同一文档。一次只能有一个线程保持写锁定。因此,线程执行的更新(最后收到锁定)将存储在集合中。
我希望能够解除你的疑虑。
答案 1 :(得分:0)
基本思想是对数据进行非规范化。如果您的模式基于一个独特的关系结构,您可以在文档中使用指向其他集合中相关文档的引用,然后由您的应用程序解析。例如,PHP驱动程序为这样的引用提供API,但是它们不会加载它或自动跟随链接/引用&#34;。
MongoDB 3.2在聚合框架中引入了$lookup
运算符,以直接引用同一数据库中的另一个集合。
对单个(无上限)集合的大小没有明确的限制(在64位系统上);主要限制是单个文档的最大大小为16MB,最大嵌套级别为100.隐式大小限制是数据库大小,命名空间和索引大小以及数据库中的最大集合数,所有这些都取决于所使用的存储引擎和底层操作系统。另请参阅SO上的相关问题here。
对于基于集合的事务,MongoDB docs建议使用更新文档中的事务集合和事务状态键,提供&#34;类似事务的语义&#34;类似事务的语义。