mysql性能INSERT到表SELECT中进行报告

时间:2013-01-24 17:04:03

标签: mysql insert report sql-optimization

我正在处理报告的mysql查询。我们的想法是让一个简单的表格显示'reportTable',其值从不同的地方获取。然后我可以更容易地使用reportTable而不记住大量的连接等,并且还可以为其他项目共享此表。

  1. 我应该分解查询的内部插入部分吗? 我一次会添加数万行?

  2. INSERT INTO reportTable
    (
       -- long query grabbing results from various places
       SELECT var1 FROM schema1.table1
       SELECT var2 FROM schema2.table1
       SELECT var2 FROM schema2.table1
       etc
    )
    

2 个答案:

答案 0 :(得分:1)

这解决了您插入数据需要太长时间等问题。我明白这就像你每次重建你的桌子一样。因此,不要这样做,只需获取新表中尚未存在的数据。查看报表中是否已存在数据可能也很昂贵,只需获取增量即可。方法如下:

确保在每个表中都需要这样的列:

ALTER TABLE yourTable ADD COLUMN created timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

ON UPDATE子句当然是可选的,不知道您是否需要跟踪更改。如果是,请给我一个评论,我可以为您提供一个解决方案,您可以用它来记录您的数据。

现在你需要一个包含一些元信息的小表。

CREATE TABLE deltameta (tablename varchar(50), LSET timestamp, CET timestamp);

LSET是上次成功提取时间的缩写,是当前提取时间的CET。

当您获得数据时,它的工作方式如下:

UPDATE deltameta SET CET = CURRENT_TIMESTAMP WHERE tablename = 'theTableFromWhichYouGetData';
SELECT @varLSET := LSET, @varCET := CET FROM deltameta WHERE tablename = 'theTableFromWhichYouGetData';
INSERT INTO yourReportTable (
    SELECT whatever FROM aTable WHERE created >= @varLSET AND created < @varCET
);
UPDATE deltameta SET LSET = CET WHERE tablename = 'theTableFromWhichYouGetData';

如果在插入脚本期间出现任何问题,则会在下次运行时获得相同的数据。此外,如果需要回滚,可以在此处使用事务处理。如果您需要帮助,请再次撰写评论。

答案 1 :(得分:0)

我可能错了,但你似乎在谈论基本观点。您可以在此处阅读对视图的介绍:http://techotopia.com/index.php/An_Introduction_to_MySQL_Views,以下是mysql视图文档:http://dev.mysql.com/doc/refman/5.0/en/create-view.html