将数据从一个MySQL数据库导入另一个MySQL数据库的最有效方法

时间:2009-11-19 01:44:47

标签: mysql import load-data-infile

我正在编写一个PHP脚本,它将数据从两个不同数据库中的表导入另一个数据库。我已经使用了样本数据,但现在我已经开始使用更接近其最终用途的数据:每张表超过2500万条记录,并且每天都在增长。显然,效率是一个值得关注的问题。

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

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;

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

3 个答案:

答案 0 :(得分:2)

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

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

如果对第一个问题的答案为“是”而对第三个问题的答案为“否”,则使用LOAD DATA INFILE的答案可能很多。从DB1和DB2中选择数据并按顺序加载它们。

答案 1 :(得分:0)

在On Duplicate Key Update上,不需要更新field1和field2,因为它们是关键并且已经匹配。

另一个问题是:你是否关心如果1将field3设置为一个值然后将其设置为另一个 - 然后明天和之后的第二天 - 这是要知道发生了什么?

答案 2 :(得分:0)

您是否考虑过使用federated tables