我想在 MySql 中定期(每小时)将一些分析视图保存到永久 table
I want to save some analytics views to a permanent table periodically (hourly) in MySql
我创建了一些视图来分析很多table,所以视图有延迟。
但我需要 运行 从分析视图中进行更快的查询。
因此,我将定期将视图保存到 table。
这个问题有什么好的解决方案?
我想这可以通过 EVENT 来实现。确保全局系统变量 EVENT_SCHEDULER 已启用。
set global event_scheduler=on;
delimiter //
drop event if exists hourly_job //
create event hourly_job on schedule every 1 hour starts now() do
BEGIN
insert into your_analytic_table select * from your_view ; -- put whatever you want to do in the body part
END//
event_scheduler会根据设置的时间间隔执行正文部分的代码,在本例中设置为每1小时一次。当然可以更改时间间隔以满足您的要求。例如每 10 分钟
这是构建和维护 Summary Tables 的几种方法之一。
对于 blabla_bingo 所建议的定期汇总,您可以在 DATETIME
上建立索引以仅获取给定小时内的行(用于汇总)或“记住您离开的地方”。我喜欢后者,因为如果那是 suitable.
,那可能会导致“连续”总结
请谨慎选择您需要的行。总结;在行 COMMITted
乱序的情况下,可能会出现细微的问题(缺少行);等等
IODKU 对于大多数技术都很有用,包括在插入 'Fact' table.
的同时更新摘要 tables
例如,根据“维度”dim_a 和 dim_b 更新每日摘要时:
INSERT INTO summary
(dy, dim_a, dim_b, ct, sum_x, ...)
SELECT
DATE(datetime) AS dy, dim_a, dim_b,
COUNT(*) as ct, SUM(x) AS sum_x
FROM fact_table
WHERE id > $left_off
AND id < $stopper
GROUP BY
DATE(datetime), dim_a, dim_b
ON DUPLICATE KEY UPDATE
ct = VALUES(ct) + 1,
sum_x = VALUES(sum_x) + x,
...
其中 $left_off
可能是来自上次更新的 MAX(datetime)
,而 $stopper
是对该来源 table 的一些限制。 (请提供有关您的示例的更多详细信息;也许我可以更具体。)
我创建了一些视图来分析很多table,所以视图有延迟。 但我需要 运行 从分析视图中进行更快的查询。 因此,我将定期将视图保存到 table。 这个问题有什么好的解决方案?
我想这可以通过 EVENT 来实现。确保全局系统变量 EVENT_SCHEDULER 已启用。
set global event_scheduler=on;
delimiter //
drop event if exists hourly_job //
create event hourly_job on schedule every 1 hour starts now() do
BEGIN
insert into your_analytic_table select * from your_view ; -- put whatever you want to do in the body part
END//
event_scheduler会根据设置的时间间隔执行正文部分的代码,在本例中设置为每1小时一次。当然可以更改时间间隔以满足您的要求。例如每 10 分钟
这是构建和维护 Summary Tables 的几种方法之一。
对于 blabla_bingo 所建议的定期汇总,您可以在 DATETIME
上建立索引以仅获取给定小时内的行(用于汇总)或“记住您离开的地方”。我喜欢后者,因为如果那是 suitable.
请谨慎选择您需要的行。总结;在行 COMMITted
乱序的情况下,可能会出现细微的问题(缺少行);等等
IODKU 对于大多数技术都很有用,包括在插入 'Fact' table.
的同时更新摘要 tables例如,根据“维度”dim_a 和 dim_b 更新每日摘要时:
INSERT INTO summary
(dy, dim_a, dim_b, ct, sum_x, ...)
SELECT
DATE(datetime) AS dy, dim_a, dim_b,
COUNT(*) as ct, SUM(x) AS sum_x
FROM fact_table
WHERE id > $left_off
AND id < $stopper
GROUP BY
DATE(datetime), dim_a, dim_b
ON DUPLICATE KEY UPDATE
ct = VALUES(ct) + 1,
sum_x = VALUES(sum_x) + x,
...
其中 $left_off
可能是来自上次更新的 MAX(datetime)
,而 $stopper
是对该来源 table 的一些限制。 (请提供有关您的示例的更多详细信息;也许我可以更具体。)