0

假设,在我的带有列的表中

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 并推送到临时表。
  • 使用临时表内部连接基表并删除行

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

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

  • 使用插入忽略选项进行表转储(在从属设备上完成以减少负载)
  • 将数据恢复到 diff DB
  • 用重命名表交换了两个表
  • 增量数据更改也被复制(我们这里有停机时间)这可以通过几分钟的停机时间来完成。它对我有用,因为表上没有更新(我们只有插入)。

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

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

有更好的方法吗?

4

1 回答 1

0

使用 mysqldump 并将整个表导出到一个文本文件中,该文件为“|” 分开。

如下图所示,

表.dat

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

假设 table.dat 有 10 亿条记录。

  1. 将 table.dat 文件拆分为 1000 个子文件。
  2. 使用 AWK、SED、SHELL、PERL 或 RUBY(我喜欢 ruby​​)并从 PARALLEL 中的所有 1000 个文件中删除重复的行。请参阅“unix 中的后台进程”
  3. 将 1000 个文件整合到 1 个 dat 文件中。
  4. 再次删除重复。(效率有点低,这部分,思考和优化)
  5. 确保您的最终 dat 文件没有任何重复的行。

将 final.dat 加载到表中!

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

于 2013-03-15T21:04:57.873 回答