【问题标题】:de-normalization, weighted aggregates for updated tables in MySQLMySQL 中更新表的非规范化加权聚合
【发布时间】:2011-03-14 22:24:17
【问题描述】:

这一次我得到了一个更笼统的问题。如果原始数据定期更新,我应该使用多个视图而不是存储过程来加权聚合数据吗?

基本上我有一个本地 MySQL 数据库,它通过从更大的事务数据库中导入相同类型的数据(表)来定期更新。

本地数据库用于统计分析。因此,我在本地对数据进行去规范化(基本上聚合)以用于统计软件包。到目前为止,我使用了存储过程,因为我觉得当加权方案(基本上是其他包含与变量相乘的权重的表)发挥作用时,它更容易处理(并且安排得更清楚)。

虽然存储过程的缺点是当表中填充了新数据时,我会再次运行所有这些过程。显然我不是 DBA ......所以不要回避陈述显而易见的事情 :) 处理这种情况的最佳方法是什么? SP 还是意见?还是完全不同的东西?

感谢您提前提出任何建议!

【问题讨论】:

    标签: mysql aggregation denormalization


    【解决方案1】:

    这取决于(这是任何“一般”问题的通用答案,不是吗?:))。您需要评估权衡,以了解最适合您需求的解决方案。

    Views 基本上只是查询重写(在 MySQL 中),因此每次运行查询时使用视图都会执行聚合/非规范化。这可能会使您的查询速度比您希望的要慢。另外,如果您的程序真的很复杂,那么尝试将这种逻辑放入视图中可能是不切实际的。

    Stored procedures 只做一次,查询会更快。但是您的更新不会自动显示。所以我认为答案取决于数据更改的频率、查询的运行频率以及查询性能的重要性。

    至于其他建议,如果您的数据更新是定期的,并且您只是想避免手动运行程序的任务,您也可以使用 events 运行您的存储过程。

    另一种选择是使用triggers 更新非规范化/聚合表。当您更新源表中的数据时,触发器将自动使聚合表保持最新状态。

    Here 是指向存储过程、视图、触发器和事件文档的链接。

    【讨论】:

    • 哇,这真的很有帮助。我真的希望得到更多取决于答案/意见。谢谢内森!
    • 事实上我得到了不止一个sp。可能在我的情况下将它们总结为一个 sp(即在另一个 sp 中使用几个 sp)。另一方面,我预计不会出现性能问题,表并不小,但最多包含可处理的 ~ 10.000 行。
    • 如果你的表很小,使用视图应该不是问题,性能方面。
    猜你喜欢
    • 2013-08-21
    • 2018-06-06
    • 1970-01-01
    • 2011-09-24
    • 2013-01-08
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2015-06-25
    相关资源
    最近更新 更多