【问题标题】:MongoDB performance while migration from MYSQL to MongoDB从 MYSQL 迁移到 MongoDB 时的 MongoDB 性能
【发布时间】:2015-11-27 18:53:26
【问题描述】:

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

假设一个表中有 100,00 行,它在 MySQL 中映射到 3 或 4 个表,在这种情况下,对于 MongoDB,单个文档的数据量会很大。 我对此有几个问题 -

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

【问题讨论】:

    标签: mysql mongodb transactions


    【解决方案1】:

    基本思想是数据的非规范化。如果您的架构基于一个可区分的关系结构,您可以在文档中使用指向其他集合中相关文档的引用,然后您的应用程序可以解析这些文档。例如,PHP 驱动程序为此类引用提供了API,“但它们不会加载它或自动跟随链接/引用”。

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

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

    对于基于集合的事务,MongoDB docs 建议提供“类事务语义”的两阶段提交模式,在更新的文档中使用事务集合和事务状态键。

    【讨论】:

      【解决方案2】:

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

      1. 集合的最大可能大小

        在 MongoDB 中,您可以在数据库上拥有的 maximum possible size 为 32TB。如果您认为您的收藏将超过该限制,那么您应该考虑sharding

      2. 更新文档

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

      3. 锁定

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

      我希望这能消除你的疑虑。

      【讨论】:

      • 扩展一下并发写入:实际上,所有的写入请求都由引擎排队并一个接一个地授予写入锁,直到所有写入操作都执行或超时。所以一般来说,在同一个文档上没有真正的并发写入操作——这正是所有 DBMS 在锁定状态下表现出的行为。
      • 马库斯解释得很好
      猜你喜欢
      • 2014-08-21
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多