2009-11-19 217 views
1

我正在編寫一個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

回答

2

您確定沒有重複的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

0

那麼您在重複鍵更新,有沒有需要更新字段1和Field2,因爲他們是關鍵的,並已匹配。

另一個問題是:你介意1套字段3到一個值,然後2臺給其他 - 並再次明天,後天 - 是這件事你必須知道發生了什麼?

+0

來自「其他」數據庫的數據不會相互覆蓋,因爲有「源」列使其對每個數據庫都是唯一的。 – nickf 2009-11-19 02:24:46

相關問題