2012-09-10 42 views
4

我試圖糾正一個月的關係數據庫,但我找不到有效的解決方案。Mysql關係數據庫與不同的密鑰重複

Hier是我的問題: 我有534 M行關聯Db與許多外鍵(30)。

我可以使用union ... group來處理正常的重複... havin count(*)= 1通過插入,但也有不同鍵的duplciates。

例如:

表1

id | key1 | value 
1 | 11 | a1 
2 | 22 | a1 

表2

key1 | value 
11 | a2 
22 | a2 

Foreign key table1(key1) references table2(key1) 

我試圖找到,刪除重複,糾正家長。 我已經嘗試了3點不同的方式,

1:PHP腳本,陣列

導出表(轉儲) - > array_unique,查找重複,糾正家長陣列 - >導入表

它非常快,但需要80GB內存,這可能是問題在未來

2:PHP腳本,SQL查詢

exporrt表(轉儲) - >找到重複項 - >向父表發送查詢

不需要內存,但表格非常大,5個查詢需要1秒鐘,50 M個副本需要幾天,幾個月,幾年

3:ON DUPLICATE UPDATE KEY:我添加一個列 '重複' 來存儲重複的鍵和予定義的所有列,除了密鑰作爲唯一的密鑰,
插入....上的重複更新的concat(重複,」 ;」,VALUES(鍵))。

但有些表已經超過1個鍵,有時我應該定義24列作爲唯一索引和存儲問題再次

我希望我可以解釋我的問題。你有什麼主意嗎 ?

+0

難道你不能在版塊1的塊?首先對它進行排序,以節省內存,對文件和內存進行合併排序。輕鬆刪除重複項,方便一次,允許邊緣情況。然後生成一個導入。 – Orbling

+0

你說得對,其實我可以通過排序數組和導入塊來減少內存使用量,但是php並不是很好的垃圾回收機制(一些大文件存在一些愚蠢的內存泄漏),我應該嘗試一下,thanx – ekicion

+0

你能澄清一下這是不是你希望定期演出,還是一次性演出?我假設你的「未來可能會有問題」,可能需要重複。 – almcnicoll

回答

0

爲什麼不簡單地在列上創建唯一鍵。只需使用「忽略」關鍵字,它將刪除重複的記錄。
因此,您的查詢將如下所示:
ALTER IGNORE TABLE testdbtable1 ADD UNIQUE INDEX column1column1 ASC);

+0

我應該修復父表中的鍵,所以我不能輕易忽略它們 – ekicion