【发布时间】: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