我正在构建一个Rails应用程序,它将有一些漂亮 超大5亿行的大表。让事情变得活泼 我目前正在研究如何将大表拆分为更多 可管理的块。我看到,从MySQL 5.1开始,有一个分区 选项,这是一个可能的选择,但我不喜欢列的方式 确定分区必须是主键的一部分 桌子。
我真正想做的是拆分AR模型写入的表格 基于所写的价值,但据我所知,没有办法 做到这一点 - 有没有人对我的方式有任何建议 实施这个或任何替代战略?
由于
Arfon
答案 0 :(得分:5)
MySQL中的分区列不限于主键。实际上,分区列根本不必是一个键(尽管将透明地创建一个分区列)。您可以按RANGE,HASH,KEY和LIST进行分区(仅与RANGE类似,它是一组离散值)。阅读an overview分区类型的MySQL手册。
还有其他解决方案,例如HScale - 一个中间件插件,可根据特定条件透明地对表进行分区。 HiveDB是一个用于MySQL水平分区的开源框架。
除了分片和分区之外,您还应该使用某种聚类。最简单的设置是基于复制的设置,可帮助您将负载分散到多个物理服务器上。您还应该考虑更高级的群集解决方案,例如MySQL群集(由于数据库的大小可能不是一个选项)和群集中间件,例如Sequioa。
我实际上在一段时间之前就堆栈溢出问了一个关于scaling with MySQL的相关问题,几天后我收集了很多关于这个主题的信息后,我最终回答了自己。也可能与你相关。
答案 1 :(得分:1)
如果您想按时间拆分数据,以下解决方案可能符合您的需要。您可以使用MERGE表;
假设您的表名为MyTable,并且您每周需要一个表
如果要获取过去三个月的所有数据,可以创建一个合并表,其中仅包含过去3个月的表。根据需要创建尽可能多的合并表。如果不包含当前插入数据的表(在我们的示例中为MyTable),您将更加高兴,因为您将没有任何读/写并发
答案 2 :(得分:1)
您可以使用DataFabric在Active Record中完全处理此问题。
如果不合适,自己实施类似行为并不复杂。谷歌分享了关于在应用层内处理表分区的架构模式的大量讨论。它具有避免中间件或依赖于db vender特定功能的优点。另一方面,您负责的应用程序中有更多代码。