MySQL从单个选择中多次插入

时间:2017-06-18 03:04:12

标签: php mysql sql

我有一个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中完成吗?

请参阅并提出建议。

1 个答案:

答案 0 :(得分:0)

每天500,000行是可观的数据量。通常使用主表上的触发器来处理此过程 - 触发器将插入新数据。

您的date列表明您有批量上传过程。  如果是这样,您可以在执行上载后将行添加到摘要表中。这比搞乱触发器要简单得多,这将在汇总表上进行数以万计的更新。