【发布时间】:2017-03-17 19:23:53
【问题描述】:
我正在开发一个 Grails 应用程序来替换已经运行多年的桌面数据库应用程序(事实上,自 1991 年以来以各种形式运行)。有一个销售表,其中包含 25 年的销售额。不过,我大部分时间感兴趣的只是一组仍然活跃的销售,可能可以追溯到一个月左右。我不希望这些搜索等被大量旧数据拖累。但是,我确实需要在某些地方访问旧数据以进行存档搜索。
解决这个问题的一个明显方法是有一个单独的域类,比如 ArchivedSale,具有与 Sale 相同的属性,并且一旦 Sale 不再有效(例如,数据已发布到帐户)我可以创建从中提取 ArchivedSale 并删除原始文件。不过,这确实让我觉得违反了不要重复自己的原则——我必须在这两个地方进行任何域类更改,这感觉不是一个好主意。
如果我使用 MySQL 分区,也许我不需要关心性能?我可以在一个分区中拥有 2015 年或更早日期的所有销售,而在另一个分区中拥有其他所有销售,这将很好地解决任何性能问题。不过,我以前从未使用过分区,并且阅读它我有点担心,因为似乎需要在分区标准中使用主键,而且我知道我不能真正玩弄 MySQL主键,因为它们对 Grails 的工作方式至关重要。
我想知道有没有人用 Grails 做过与上述类似的事情,可以给我一些提示吗?或者,如果做不到这一点,是否还有其他我可能忽略的问题的好解决方案?
【问题讨论】:
-
如果合适的索引可用且正在使用,并且 SQL 已调整,那么 MySQL 分区可能会在某些非常特定的情况下提高某些查询的性能。 (查询必须专门使用允许 MySQL 优化器进行“分区修剪”的谓词编写。)但是分区真正发光的地方是管理大量数据,极大地提高了某些操作的效率(例如作为清空整个分区),并使得更易于管理的集合。分区本身并不是提高性能的灵丹妙药。
-
另一种可能性是有两个数据源,一个一旦设置就不会被操纵,另一个是您保持最新信息的清理。小心地管理你如何管理它,但这意味着你将一次事务写入两个数据库。这就是答案,不要重复自己
-
同一个域类可以使用两个数据源吗?
-
确保它是静态映射={datasources(['myotherDatasource','DEFAULT']) } 然后在两个不同的数据库上生成域类,默认是主数据源和 myotherDataSource,如所述。您将需要研究如何配置和使用它。它还有其他并发症,但可以通过@myusername 来引起我的注意,否则我不会得到标记
标签: mysql grails partitioning