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

问题描述:

我正在编写一个PHP脚本,它将两个不同数据库中表的数据导入到另一个数据库中。除了现在我已经开始使用更接近它的最终用途的数据:每张表格有2500多万条记录,并且每天都在增长,我已经可以使用示例数据了。显然,效率有点令人担忧。将数据从一个MySQL数据库导入到另一个数据库的最有效方法

以下是当前的工作原理。我复制表结构,增加一对额外的域来维护密钥完整性:

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; 

我的问题是这样的:这可能是最好的方式做到这一点?考虑到将会有数百万和数百万条记录,每个表中总共有几千兆字节的数据,是否还有其他方法可能会更快?

+2

你有shell吗?有一个名为mysqldump的MySQL工具。 – powtac 2009-11-19 01:46:01

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

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

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

+0

不幸的是第一个和第三个问题的答案为“不”和“是”。 – nickf 2009-11-19 02:23:43

+0

那么你需要做什么样的处理呢?就重复ID而言,如果您使用“源”列来区分,则可以继续这样做。 – ChssPly76 2009-11-19 03:04:26

+0

主要是修剪数据,有时会改变类型(字符串到日期,字符串到int等) – nickf 2009-11-19 05:05:18

那么您在重复键更新,有没有需要更新字段1和Field2,因为他们是关键的,并已匹配。

另一个问题是:你介意1套字段3到一个值,然后2台给其他 - 并再次明天,后天 - 是这件事你必须知道发生了什么?

+0

来自“其他”数据库的数据不会相互覆盖,因为有“源”列使其对每个数据库都是唯一的。 – nickf 2009-11-19 02:24:46

你有没有考虑过使用federated tables