MySQL表中的重复数据

时间:2013-03-15 16:43:19

标签: mysql

假设在我的表中有列

id | email     | name
1  | aa@aa.com | aa
2  | aa@aa.com | aaa
3  | bb@b.com  | bb

假设我想删除重复的条目,最好的办法是什么? (如果存在多个条目,则保留第一条记录)。我的表也是40GB + /十亿的记录。

我们的选择是:

1)

ALTER IGNORE TABLE table_name ADD UNIQUE INDEX (email);

由于我们4小时的停机时间并不具有吸引力,因此甚至无法想象。

2)

  • 确定您必须使用group by删除的ID并推送到temp 表。
  • 内部联接基表与临时表并删除行

这将产生漏洞和性能问题。

3)我们做的解决方案是,

  • 使用insert ignore选项进行转储(在slave上完成以减少负载)
  • 将数据恢复为差异数据库
  • 使用重命名表交换了两个表
  • 还复制了增量数据更改(我们这里有停机时间) 这可以在几分钟的停机时间内完成。它对我有用,因为桌面上没有更新(我们只有插入)。

如果还支持更新,最佳解决方案是什么。我的主要限制是停机时间?

可以通过启用包括表在内的更新查询的日志来扩展3,并在恢复后运行相同的内容。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

使用mysqldump并将整个表导出为文本文件“|”分离。

如下所示,

table.dat

1|aa@aa.com|aa
2|aa@aa.com|aaa
3|bb@b.com|bb

让我们说table.dat有10亿条记录。

  
      
  1. 将table.dat文件拆分为1000个子文件。
  2.   
  3. 使用AWK,SED,SHELL,PERL或RUBY(我喜欢ruby)并从PARALLEL中的所有1000个文件中删除重复的行。见“背景   unix中的过程“
  4.   
  5. 将1000个文件集成到1个dat文件中。
  6.   
  7. 再次删除重复项。(有点效率低下,这部分,思考和优化)
  8.   
  9. 确保您的最终dat文件没有任何重复的行。
  10.   

将final.dat加载到表中!

这可以更快一点!无论如何不要停止寻找最好的方式。