2017-03-04 72 views
-1

我正在尋找大數據問題的最佳解決方案。我一直在想一會兒,很高興聽到你的意見。在大型數據庫表中標記重複記錄的最快方法

我有一個MySQL數據庫,其中包含大約5.000.000條記錄,每天加載並更改(新記錄和更改記錄)。

該表中有一些重複的記錄,我希望每天都有記錄。

表中有20列。我想查找在表格的4列中具有相同數據的重複記錄。

另外,我發現重複我需要通過每個重複記錄循環更新我的搜索功能,並更新表中它是複製到其他產品的記錄。

我想盡可能少使用mysql資源,並儘可能快地創建腳本。

現在我有以下查詢,但它是真的慢:

SELECT GROUP_CONCAT(id SEPARATOR '|') as ids, 
     GROUP_CONCAT(stock SEPARATOR '|') as stock 
FROM table 
GROUP BY column1, column2, column3, column4 
HAVING count(id) > 1; 

我可以把指標上的列,但我認爲它仍然會無法運行此查詢慢。

我很好奇你的願景。

+1

請參閱http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query如果點可以在5或6中有效傳達,我們不需要看到20列 – Strawberry

回答

1

這聽起來像你想這樣的查詢:(這基本上是你的查詢這是我將開始,雖然)。

select col1, col2, col3, col4, 
     group_concat(id separator '|') as ids, 
     group_concat(stock separator '|') as stocks 
from stock s 
group by col1, col2, col3, col4 
having count(*) > 1; 

或者,它可能會更快得到每個重複的行。您可以通過使用做到這一點:

select s.* 
from stock s 
where exists (select 1 
       from stock s2 
       where s2.col1 = s.col1 and s2.col2 = s.col2 and 
        s2.col3 = s.col3 and s2.col4 = s.col4 and 
        s2.id <> s.id 
      ); 

對於這個工作有任何希望,你需要stock(col1, col2, col3, col4, id)的索引。這個公式假設這些列中的值不是NULL

注意:如果速度更快但仍需要原始格式,則可以將此條件置入group by查詢中。

說實話,雖然。我認爲正確的做法是對四列的唯一索引:

create index unq_stock_col1_col2_col3_col4 on stock(col1, col2, col3, col4); 

然後處理重複問題時,update S或insert小號修改數據。最好在數據庫中進行數據完整性檢查,並且不要讓數據問題無法實現。

+0

我首先嚐試了你建議的備選查詢。奇怪的是,它需要與我的舊查詢相同的時間。 我的舊查詢avg:60.026384115219 您的查詢:60.062566995621 –

+0

我會嘗試現在的索引。什麼是最好的方法,四列的索引或每列的索引? –

+1

@BoPennings。 。 。如指定的那樣,在所有五列上都有一個索引。 –

相關問題