2017-03-04 112 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。 。 。如指定的那样,在所有五列上都有一个索引。 –

相关问题