【问题标题】:Duplicate Data in MySQL tableMySQL表中的重复数据
【发布时间】:2013-03-15 16:43:18
【问题描述】:

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

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,并在恢复后运行相同的日志。

有没有更好的方法?

【问题讨论】:

  • 您的表是 40GB?我猜这与电子邮件地址无关!?!
  • 为什么孔很重要?如果您的代码依赖于没有漏洞的连续 id,那么您的代码构造错误。选项 2 归结为这个答案:stackoverflow.com/questions/4685173/…
  • @Strawberry :显然,我节省的远不止这些。
  • @MarcB:我的实际表有 2-3 个索引,包括复合索引。我的大多数查询都不在 id 上。根据我的理解,无论您使用什么索引,有孔的表都会显示性能问题。 ANALYZE TABLE 可以提供帮助

标签: mysql


【解决方案1】:

使用 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. 使用 AWK、SED、SHELL、PERL 或 RUBY(我喜欢 ruby​​)并从 PARALLEL 中的所有 1000 个文件中删除重复的行。见“背景 unix 中的进程"
  3. 将 1000 个文件集成到 1 个 dat 文件中。
  4. 再次删除重复。(效率有点低,这部分,思考和优化)
  5. 确保您的最终 dat 文件没有任何重复的行。

将 final.dat 加载到表中!

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

【讨论】:

  • 这只有在整个活动期间我的表中不涉及更新时才有效。和我们做的有点相似,只是我们直接使用mysql本身来解决我们的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
相关资源
最近更新 更多