我想在 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 的一些限制。 (请提供有关您的示例的更多详细信息;也许我可以更具体。)