从MYSQL迁移到MongoDB时的MongoDB性能

时间:2015-11-27 06:30:28

标签: mysql mongodb transactions

我在MySQL中有一个包含10个表的数据库。 这些表之间存在复杂的映射。现在我想将相同的数据库迁移到MongoDB。 我在MongoDB中为它创建了一个示例数据库。数据库中的映射使文档变得复杂。

假设表中有100,00行,并且在MySQL中使用3或4个表进行映射,对于MongoDB,单个文档的数据量将很大。 关于同样的问题我几乎没有问题 -

  • 由于MongoDB不支持Join概念,因此集合中将存在重复数据。我想知道单个集合的最大可能大小?
  • 如果文档大小较大,是否会在更新时对性能产生影响?
  • 由于MongoDB支持基于集合的事务,因此如果在单个集合上发生事务,则可以进行回滚。 它是否有基于文档/集合的锁定机制?多个线程可以同时更新单个文档吗?

2 个答案:

答案 0 :(得分:0)

我根据我在mongoDB上的3年经验来回答这个问题。

  1. 最大可能的收集尺寸

    在MongoDB中,数据库中的maximum possible size为32TB。如果您认为自己的收藏会超出此限制,那么您应该考虑sharding

  2. 更新文档

    即使您有数百万个文档提供了适当的索引设置,MongoDB也可以很好地执行更新。您需要考虑更新的另一件事是,如果您的更新将大幅改变文档的大小,那么mongoDB需要将此文档移动到另一个内存位置。如果同时进行此类更新,则会降低性能。但是,如果您的应用程序有很多这样的更新操作,那么您需要为您的集合设置适当的填充因子。这可以按照here所述完成。请注意,填充因子仅在您使用MMAPv1存储引擎时适用。

  3. <强>锁定

    您必须注意mongoDB不支持事务,它提供文档级别的ACID属性,而不是集合级别。根据最新版本的MongoDB(v3.0.x),它提供了文档级锁定。 MongoDB数据库中描述了一整页项目,解释了mongodb中的锁定。链接here。多个线程只有在获得写锁定后才能更新同一文档。一次只能有一个线程保持写锁定。因此,线程执行的更新(最后收到锁定)将存储在集合中。

  4. 我希望能够解除你的疑虑。

答案 1 :(得分:0)

基本思想是对数据进行非规范化。如果您的模式基于一个独特的关系结构,您可以在文档中使用指向其他集合中相关文档的引用,然后由您的应用程序解析。例如,PHP驱动程序为这样的引用提供API,但是它们不会加载它或自动跟随链接/引用&#34;。

MongoDB 3.2在聚合框架中引入了$lookup运算符,以直接引用同一数据库中的另一个集合。

对单个(无上限)集合的大小没有明确的限制(在64位系统上);主要限制是单个文档的最大大小为16MB,最大嵌套级别为100.隐式大小限制是数据库大小,命名空间和索引大小以及数据库中的最大集合数,所有这些都取决于所使用的存储引擎和底层操作系统。另请参阅SO上的相关问题here

对于基于集合的事务,MongoDB docs建议使用更新文档中的事务集合和事务状态键,提供&#34;类似事务的语义&#34;类似事务的语义。