2008-11-27 109 views
10

我期待在建设,这将有500万行向上一些漂亮 大桌的Rails应用程序。为了让事情保持活泼 我目前正在研究如何将大型表格拆分为更易于管理的块。我认为这是MySQL 5.1中的有一个分区 选项,这是一个可能的选择,但我不喜欢,确定分区列 必须对 表的主键的一部分的方式。策略处理大型数据库表

我真正喜欢做的分割,一个AR模型写入基于价值观写,但据我所知是没有办法 做到这一点 表 - 没有任何人有任何建议,我怎么可能 实施这个或任何替代策略?

由于

Arfon在MySQL

回答

5

分区列不限于主键。实际上,分区列并不一定是关键(尽管透明地创建一个分区)。你可以用RANGE,HASH,KEY和LIST(它与RANGE类似,只是它是一组离散值)进行分区。请阅读MySQL手册,了解分型类型的an overview

有替代解决方案,例如HScale - 中间件插件,透明地划分基于特定标准表。 HiveDB是一个用于MySQL水平分区的开源框架。

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

我实际上在一段时间之前询问了关于scaling with MySQL的一个关于堆栈溢出的相关问题,几天后我收集了大量有关该主题的信息后最终回答自己。也可能与你有关。

1

如果您想通过时间来分割你的DATAS,以下解决方案可满足您的需要。你可以使用MERGE表;

让我们假设你的表名为MyTable的,并且需要每周一个表

  1. 你的应用始终会记录在同一个表
  2. 每周工作原子重命名你的表,并重新创建一个空:MyTable的重命名为MyTable-Year-WeekNumber,并创建一个新的空MyTable
  3. 合并表被删除并重新创建。

如果要获取过去三个月的所有数据,请创建一个合并表,该合并表仅包含最近3个月的表。创建尽可能多的合并表,因为需要不同的时间段。如果你能包括其中的数据都是当前插入(MyTable的在我们的例子)表,你会更快乐,因为你不会有任何读/写并发

1

您可以完全处理此在活动记录中使用DataFabric

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