假设在我的表中有列
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)
这将产生漏洞和性能问题。
3)我们做的解决方案是,
如果还支持更新,最佳解决方案是什么。我的主要限制是停机时间?
可以通过启用包括表在内的更新查询的日志来扩展3,并在恢复后运行相同的内容。
有更好的方法吗?
答案 0 :(得分:0)
使用mysqldump并将整个表导出为文本文件“|”分离。
如下所示,
table.dat
1|aa@aa.com|aa
2|aa@aa.com|aaa
3|bb@b.com|bb
让我们说table.dat有10亿条记录。
- 将table.dat文件拆分为1000个子文件。
- 使用AWK,SED,SHELL,PERL或RUBY(我喜欢ruby)并从PARALLEL中的所有1000个文件中删除重复的行。见“背景 unix中的过程“
- 将1000个文件集成到1个dat文件中。
- 再次删除重复项。(有点效率低下,这部分,思考和优化)
- 确保您的最终dat文件没有任何重复的行。
醇>
将final.dat加载到表中!
这可以更快一点!无论如何不要停止寻找最好的方式。