【问题标题】:Strategy for dealing with large db tables处理大型数据库表的策略
【发布时间】:2010-09-24 08:35:33
【问题描述】:

我正在考虑构建一个 Rails 应用程序,它会有一些漂亮的 超过 5 亿行的大型表。为了让事情变得活泼 我目前正在研究如何将大表拆分为更多 可管理的块。我看到从 MySQL 5.1 开始有一个分区 选项,这是一个可能的选项,但我不喜欢列的方式 确定分区必须是主键的一部分 桌子。

我真正想做的是拆分 AR 模型写入的表 基于所写的值,但据我所知,没有办法 要做到这一点 - 有没有人对我如何可能有任何建议 实施这个或任何替代策略?

谢谢

阿方

【问题讨论】:

    标签: mysql ruby-on-rails ruby database


    【解决方案1】:

    MySQL 中的分区列不限于主键。事实上,分区列根本不必是键(尽管会透明地为它创建一个)。您可以按 RANGE、HASH、KEY 和 LIST 进行分区(这与 RANGE 类似,只是它是一组离散值)。阅读 MySQL 手册,了解an overview 的分区类型。

    还有一些替代解决方案,例如 HScale - 一个中间件插件,可以根据特定标准透明地对表进行分区。 HiveDB 是用于 MySQL 水平分区的开源框架。

    除了分片和分区之外,您还应该使用某种集群。最简单的设置是基于复制的设置,可帮助您将负载分散到多个物理服务器上。您还应该考虑更高级的集群解决方案,例如 MySQL 集群(由于数据库的大小,可能不是一个选项)和集群中间件,例如 Sequioa

    实际上,我前段时间在 stack-overflow 上问了一个关于 scaling with MySQL 的相关问题,几天后我在收集了有关该主题的大量信息后回答了自己。可能也与您相关。

    【讨论】:

      【解决方案2】:

      如果您想按时间拆分数据,以下解决方案可能适合您的需要。您可能可以使用MERGE 表;

      假设您的表名为 MyTable,并且您每周需要一张表

      1. 您的应用始终登录同一个表
      2. 每周作业自动重命名您的表并重新创建一个空表:MyTable 重命名为 MyTable-Year-WeekNumber,并创建一个新的空 MyTable
      3. 合并表被删除并重新创建。

      如果您想获取过去三个月的所有数据,您可以创建一个合并表,其中仅包含过去 3 个月的表。根据不同时期的需要创建尽可能多的合并表。如果你可以包含当前插入数据的表(在我们的例子中是MyTable),你会更开心,因为你不会有任何读/写并发

      【讨论】:

        【解决方案3】:

        您可以使用DataFabric 在 Active Record 中完全处理这个问题。

        如果不合适的话,自己实现类似的行为并不是那么复杂。 Google sharding 对在应用层内处理表分区的架构模式进行了大量讨论。它具有避免中间件或依赖于数据库供应商特定功能的优点。另一方面,您需要负责应用中的更多代码。

        【讨论】:

          猜你喜欢
          • 2011-03-23
          • 1970-01-01
          • 1970-01-01
          • 2013-05-17
          • 1970-01-01
          • 2019-04-01
          • 2010-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多