处理大型数据库表的策略

时间:2008-11-27 15:58:49

标签: mysql ruby-on-rails ruby database

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

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

由于

Arfon

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

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

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

  1. 您的应用始终登录同一个表
  2. 每周工作以原子方式重命名您的表并重新创建一个空表:MyTable重命名为MyTable-Year-WeekNumber,并创建一个新的空MyTable
  3. 删除并重新创建合并表。
  4. 如果要获取过去三个月的所有数据,可以创建一个合并表,其中仅包含过去3个月的表。根据需要创建尽可能多的合并表。如果包含当前插入数据的表(在我们的示例中为MyTable),您将更加高兴,因为您将没有任何读/写并发

答案 2 :(得分:1)

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

如果不合适,自己实施类似行为并不复杂。谷歌分享了关于在应用层内处理表分区的架构模式的大量讨论。它具有避免中间件或依赖于db vender特定功能的优点。另一方面,您负责的应用程序中有更多代码。