我有一个stats
表,其中记录了每日流量,每天插入约500,000条记录。
该表的结构类似于
id | ip | url | date | country | referrer | type | rate | category |....
这个表的大小不断增加,我想保留它只用于写操作
我需要对此表数据执行分析,并将结果存储在其他表中以进行报告。
我打算按如下方式存储数据。
表格stats_by_date
将按日期分组每日统计信息。
表格stats_by_country
将按国家/地区分组每日统计信息。
表stats_by_type
将按类型分组每日统计信息。
表stats_by_category
将按类别分组每日统计信息。
这样代替500,000行,每天只有1行,除了国家表,每天有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
。< / p>
我想知道有没有其他有效的方法可以做到这一点,可以在一个SELECT
中完成吗?
请参阅并提出建议。
答案 0 :(得分:0)
每天500,000行是可观的数据量。通常使用主表上的触发器来处理此过程 - 触发器将插入新数据。
您的date
列表明您有批量上传过程。
如果是这样,您可以在执行上载后将行添加到摘要表中。这比搞乱触发器要简单得多,这将在汇总表上进行数以万计的更新。