我有一个stats
表,其中记录了每日流量,并插入了大约 500,000 条每日记录。 此表的结构类似于
id | ip | url | date | country | referrer | type | rate | category |....
这个表的大小不断增加,我想保留它仅用于写入操作
我需要对此表数据执行分析,并将结果存储在其他表中以进行报告。
我计划按如下方式存储数据。
表stats_by_date
将包含按日期分组的每日统计信息。
表stats_by_country
将包含按国家/地区分组的每日统计数据。
表stats_by_type
将按类型分组的每日统计信息。
表stats_by_category
将按类别分组每日统计信息。
这样,每天只有 1 行,而不是 500,000 行,除了国家/地区表,其中每天将有 250 行。
我需要每半小时从主表在这些表中插入数据。 我知道我可以通过多个查询插入数据,例如
INSERT INTO `stats_by_date` (id, ip, date, rate, type)
(
SELECT id, COUNT(ip), date, rate, type FROM `stats`
WHERE date=today
GROUP BY date
);
INSERT INTO `stats_by_type` (id, ip, date, rate, type)
(
SELECT id, COUNT(ip), date, rate, type FROM `stats`
WHERE date=today
GROUP BY type
);
这样,将至少有 4 个INSERT
查询将从主表中读取相同的数据并根据GROUP BY
插入。
我只想从主表中读取一次并插入所有其他表。 据我所知,要实现这一目标,我知道我必须TEMPORARY TABLE
其中必须存储主表中的数据,然后从这个TEMPORARY TABLE
我可以执行多个INSERT
。
我想知道是否有其他有效的方法来做到这一点,是否可以在一次SELECT
中以某种方式完成?
请查看并提出建议。
每天 500,000 行是相当可观的数据量。 此过程通常使用主表上的触发器进行处理 - 触发器将插入新数据。
您的date
列表明您有一个批量上传过程。 如果是这样,您可以在上传后将行添加到汇总表中。 这比弄乱触发器要简单得多,触发器将在汇总表上进行大量更新。