Mysql 聚合查询的视图或存储过程? 我目前有一个600000000行的表。 对于我的报告应用程序,我希望通过使用GROUPBY子句对数据执行每日平均值来减少行数。
然后将使用我的报告应用程序中较小的数据子集,数据减少了99%Mysql 聚合查询的视图或存储过程? 我目前有一个600000000行的表。 对于我的报告应用程序,我希望通过使用GROUPBY子句对数据执行每日平均值来减少行数。,mysql,mariadb,Mysql,Mariadb,然后将使用我的报告应用程序中较小的数据子集,数据减少了99% 因为这将每天“建造”;最好的工具是什么?存储过程、视图还是其他工具?构建和维护汇总表。最初,您需要运行一个大组来收集所有旧数据。之后,夜间作业将计算前一天的计数*、总和…,等等 然后“报告”将在这个新表上运行得更快 该表的键将包括day而不是date+time,以及报告可能需要的一些列 我发现典型的加速比是10倍;您可能会得到100 x 99%的折扣 最好的工具是通过cron或MySQL事件运行的脚本。它只会做一些类似的事情 INS
因为这将每天“建造”;最好的工具是什么?存储过程、视图还是其他工具?构建和维护汇总表。最初,您需要运行一个大组来收集所有旧数据。之后,夜间作业将计算前一天的计数*、总和…,等等 然后“报告”将在这个新表上运行得更快 该表的键将包括day而不是date+time,以及报告可能需要的一些列 我发现典型的加速比是10倍;您可能会得到100 x 99%的折扣 最好的工具是通过cron或MySQL事件运行的脚本。它只会做一些类似的事情
INSERT INTO SummaryTable (dy, ..., ct, tot, ...)
SELECT DATE(datetime), ..., -- key
COUNT(*), SUM(..), ... -- data
FROM FactTable
WHERE datetime >= CURDATE() - INTERVAL 1 DAY
AND datetime < CURDATE();
这一条SQL语句可能就是所需要的全部。是的,它可以在存储过程中,但这与直接在夜间脚本中没有太大区别
在某些情况下,最好使用INSERT。。。在重复密钥更新时。。。选择但这会变得一团糟
当谈到平均值时,请考虑以下内容:
每天晚上可以计算日均值:平均值…,但
可能应该计算月平均值,而不是日平均值,而是根据SUMdaily_总和/SUMdaily_计数。也就是说,汇总表可能需要COUNT*和SUM。。。。
为了最初填充这个汇总表,我将编写一个一次性脚本,一天一天慢慢地遍历6亿行。当然,您可以一次完成所有操作,但对其他所有操作的干扰可能是“不好的”
更好的做法是在夜间脚本中包含代码,以便从它停止的地方重新开始。这样,如果某个晚上脚本无法运行,它将在第二天晚上修复遗漏。或者,当您看到问题时,可以手动运行它。再跑一次也不会有任何伤害
在编写时,考虑一下可能需要的其他汇总表。我通常发现数据仓库应用程序需要3-7个汇总表。另一方面,请记住,可以从每日汇总表中高效地导出每周和每月汇总。在一些案例中,我有一个每小时的汇总表,然后是不同事情的每日汇总表
6亿排是大的。是否将清除“旧”数据?一旦有了所需的汇总表,“旧”数据是否不再需要 您将拥有执行查询、将结果保存到表中以及执行其他簿记操作的作业。视图不会被物化或缓存,因此,如果要生成新的聚合结果,使用视图不会获得性能优势,将它们存储在表中,然后查询您将使用存储过程提供的过程方法。因此,建议使用存储过程每天运行一个作业,将新记录插入到新表中?谢谢您键入所有这些内容。通过创建一个存储过程(插入昨天的平均值),然后创建一个事件来执行它,这帮助我得到了我想要的东西。