【问题标题】: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,并且您每周需要一张表
- 您的应用始终登录同一个表
- 每周作业自动重命名您的表并重新创建一个空表:MyTable 重命名为 MyTable-Year-WeekNumber,并创建一个新的空 MyTable
- 合并表被删除并重新创建。
如果您想获取过去三个月的所有数据,您可以创建一个合并表,其中仅包含过去 3 个月的表。根据不同时期的需要创建尽可能多的合并表。如果你可以不包含当前插入数据的表(在我们的例子中是MyTable),你会更开心,因为你不会有任何读/写并发
【解决方案3】:
您可以使用DataFabric 在 Active Record 中完全处理这个问题。
如果不合适的话,自己实现类似的行为并不是那么复杂。 Google sharding 对在应用层内处理表分区的架构模式进行了大量讨论。它具有避免中间件或依赖于数据库供应商特定功能的优点。另一方面,您需要负责应用中的更多代码。