繁体   English   中英

MySQL 性能:视图 vs. 函数 vs. 存储过程

[英]MySQL performance: views vs. functions vs. stored procedures

我有一个表,其中包含一些每小时收集的统计数据。 现在我希望能够快速获得每天/每周/每月/每年/总计的统计数据。 这样做的最佳方法是什么? 创建视图? 功能? 存储过程? 还是在更新数据时我必须同时写入的普通表? (我想避免后者)。 我目前的想法是创建一个 view_day 来总结小时数,然后是 view_week 和 view_month 和 view_year 总结来自 view_day 的数据,以及 view_total 总结 view_year。 是好还是坏?

您在这里基本上有两个系统:一个收集数据,另一个报告该数据。

针对经常更新的事务表运行报告可能会导致读锁阻止写入尽快完成,因此可能会降低性能。

通常强烈建议运行定期“收集”任务,从您的(可能高度规范化的)事务表中收集信息,并将该数据填充到非规范化的报告表中,形成“数据仓库”。 然后,您将报告引擎/工具指向非规范化的“数据仓库”,可以在不影响实时事务数据库的情况下对其进行查询。

此收集任务应仅在您的报告需要“准确”时运行。 如果你可以每天一次逃脱,那就太好了。 如果您需要每小时执行一次或更多,那么 go 提前,但在执行时监控对您的写入任务的性能影响。

请记住,如果您的事务系统的性能很重要(而且通常很重要),请不惜一切代价避免针对它运行报告。

是的,拥有存储已聚合数据的表是一种很好的做法。

而视图、SP 和函数只会对大表执行查询,效率不高。

唯一真正快速且可扩展的解决方案是您所说的“更新数据时必须同时写入的普通表”,并具有适当的索引。 您可以使用触发器自动更新此类表。

我们也有类似的问题,我们所做的是利用主/从关系。 我们在 master 上处理事务数据(读取和写入,因为在我们的例子中,一些读取需要超快并且不能等待事务的复制)。 从服务器正在快速复制数据,但随后我们运行每个非事务性查询,包括报告。

我强烈建议这种方法,因为如果您的数据足够细化以在报告层/应用程序中有用,那么它很容易作为一个快速而肮脏的数据仓库来实施。

我的观点是复杂的计算应该只发生一次,因为不是每次查询时数据都会发生变化。 创建聚合数据并通过触发器(如果没有可接受的日志)或通过每天运行一次或每小时运行一次的作业或报告可接受的任何延迟时间填充它。 如果你是 go 触发路由,测试,测试,测试。 确保它可以处理多行插入/更新/删除以及更常见的单行。 确保它尽可能快并且没有任何错误。 触发器将为每个数据操作添加一些处理,您必须确保它添加尽可能少的位,并且不会发生会阻止用户插入/更新/删除数据的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM