2010-03-05 64 views
12

我有一個相當大的表,其中有19 000 000條記錄,並且存在重複行的問題。即使在這裏,還有很多類似的問題,但他們中沒有一個似乎給我一個滿意的答案。需要考慮的幾點:刪除大型表中的重複項

  • 行唯一性由兩列location_iddatetime確定。
  • 我想盡可能快地執行執行時間(< 1小時)。
  • 複製表格不是很可行,因爲表格大小爲幾個千兆字節。
  • 無需擔心關係。

如前所述,每個location_id只能有一個不同的datetime,我想刪除所有重複的實例。由於數據是相同的,它們中的哪一個存活並不重要。

任何想法?

+3

考慮暫時刪除索引,如果存在觸發器。 – Pentium10 2010-03-05 10:17:34

+0

在http://stackoverflow.com/questions/1585412/sql-to-delete-duplicate-records-in-a-table中給出的方法有什麼問題? – Mike 2010-03-05 10:17:39

+0

@ Pentium10,好點,可以加快速度,但如果我使用子查詢解決方案,也可能會導致性能下降。 – 2010-03-05 10:25:15

回答

15

我認爲你可以使用這個查詢從表中

ALTER IGNORE TABLE table_name ADD UNIQUE (location_id, datetime) 

刪除重複記錄在此之前,只是先用一些示例數據進行測試..然後試試....

注意:在5.5版上,它適用於MyISAM,但不適用於InnoDB。

+0

這看起來很有前途,我之前沒有聽說過此功能。現在嘗試一下,我會告訴你結果如何。並歡迎來到:) – 2010-03-05 11:19:53

+6

這工作,謝謝。花了31分鐘時間,經過16 982 040行,共有1 589 908個副本。我不敢相信這可能是這麼簡單,沒有額外的表格或複雜的查詢。 :) – 2010-03-05 12:10:29

+0

@Vinodkumar Saravana,我用InnoDB運行5.5,我讀了你的筆記,但我試過了,只是爲了確定。 (當然它不起作用),但是你能解釋爲什麼它在InnoDB上不起作用嗎? – tixastronauta 2013-04-04 08:21:26

1
SELECT *, COUNT(*) AS Count 
FROM table 
GROUP BY location_id, datetime 
HAVING Count > 2 
0
UPDATE table SET datetime = null 
WHERE location_id IN (
SELECT location_id 
FROM table as tableBis 
WHERE tableBis.location_id = table.location_id 
AND table.datetime > tableBis.datetime) 

SELECT * INTO tableCopyWithNoDuplicate FROM table WHERE datetime is not null 

DROp TABLE table 

RENAME tableCopyWithNoDuplicate to table 

所以,你跟上較低日期時間就行了。我不知道關於PERF,這取決於你的表列,服務器等...

0

該查詢適用於所有情況:針對200萬行的引擎:MyIsam進行了測試。

ALTER TABLE忽略表名ADD UNIQUE(LOCATION_ID,日期時間)

0

您可以使用這些步驟刪除重複的: 1導出以下查詢的結果爲txt文件:

select dup_col from table1 group by dup_col having count(dup_col) > 1 

2-加這第一的上述txt文件,並運行最終查詢:

delete from table1 where dup_col in (.....) 

請注意,「...」是txt文件的創建我的內容第一步。