2

我正在编写一个 PHP 脚本,它将两个不同数据库中的表中的数据导入另一个数据库中。我已经让它与样本数据一起工作,除了现在我已经开始使用更接近其最终用途的数据:每张表有 25+ 百万条记录,并且每天都在增长。显然,效率是一个问题。

这是它当前的工作方式。我复制了表结构,添加了几个额外的字段来维护密钥的完整性:

other1.someTable (field1, field2, field3) Pk = [field1, field2]
other2.someTable (field1, field2, field3) Pk = [field1, field2]
mydb.someTable   (id, source, field1, field2, field3)
    Pk = id, Unique key = [source, field1, field2]

这是SQL。它有一个ON DUPLICATE KEY UPDATE声明,因为这个导入需要定期进行,更新“mydb”中的数据。值得庆幸的是,不会从“其他”数据库中删除记录(我认为!)。

INSERT INTO mydb.someTable (source, field1, field2, field3)
SELECT 1, field1, field2, field3 FROM other1.someTable
ON DUPLICATE KEY UPDATE field1 = field1, field2 = field2, field3 = field3;

INSERT INTO mydb.someTable (source, field1, field2, field3)
SELECT 2, field1, field2, field3 FROM other2.someTable;
ON DUPLICATE KEY UPDATE field1 = field1, field2 = field2, field3 = field3;

我的问题是:这是最好的方法吗?考虑到将有数百万条记录,每个表总共有数 GB 的数据,还有其他方法可能更快吗?

4

3 回答 3

2

你确定没有重复的ID吗?或者,如果有,您是否总是要用第二个数据库中的数据覆盖它们?

此外,在将数据插入/更新到第三个数据库之前,您是否对从 DB1/DB2 获得的数据进行任何处理?

如果第一个问题的答案是“是”,第三个问题的答案是“否”,那么使用LOAD DATA INFILE可能会快很多。从 DB1 和 DB2 中选择数据并依次加载。

于 2009-11-19T01:51:12.987 回答
0

您是否考虑过使用联合表

于 2009-11-19T16:07:18.883 回答
0

那么在您的 On Duplicate Key Update 中,不需要更新 field1 和 field2,因为它们是键并且已经匹配。

另一个问题是:您是否关心 1 是否将 field3 设置为一个值,然后 2 将其设置为另一个值 - 明天和后天再次设置 - 这是要知道的事情吗?

于 2009-11-19T01:52:19.210 回答