MySQL百万数据删除表中重复数据只保留一条数据

看了网上方案,很多用到了关键字in,in适合类别少用的才效率高呀,而对于百万数据很多相同的话,直接导致索引失效,那就失去了这个关键字的意义了。

我这里的方案是用存储过程:首先对有重复的name分组及查询出来,然后循环删除重复数据,相同的name只保留最大id的那一条。

下面直接上存储过程:

BEGIN
	DECLARE v_name INT(32);
	DECLARE v_maxid INT(10);
	DECLARE _done INT(1) DEFAULT 0;
	# 查询出所有重复数据
	DECLARE _cur CURSOR FOR
		SELECT t1.name, MAX(t1.id) maxid
		FROM duplicated_user t1,
			(
				SELECT `name` FROM duplicated_user
				GROUP BY `name`
				HAVING COUNT(name) > 1
			) t2
		WHERE t1.name = t2.name
		GROUP BY `name`;
	# 错误定义,标记循环结束
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET _done = 1;
	
	OPEN _cur;
		FETCH _cur INTO v_name, v_maxid;
		# 循环删除重复数据
		WHILE ( _done <> 1) DO
			# 相同的name只保留最大id的那一条
			DELETE FROM duplicated_user WHERE id < v_maxid AND name = v_name;
			FETCH _cur INTO v_name, v_maxid;
		END WHILE;
	CLOSE _cur;
END

在这里插入图片描述

这是duplicated_user表的结构,我这里是测试,所以就两个字段哈。

那怎么很快的制造百万数据出来呢,请戳这篇博文:MySQL使用存储过程30秒插入百万数据!!!

好了,有了百万数据后,我们执行存储过程可能发生以下报错:

Out of range value for column

解决办法:

修改my.ini,将

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

修改为

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

然后执行大功告成

直接只有一条最大id的数据,其他相同的全部删除了

在这里插入图片描述

我看了下不到30秒,就删除了160多万数据,这里我对name还没用索引,用了索引的话快到你没话说。。。

好了,这样就解决了问题了,不知道大家有没有其他的方案,欢迎一起探讨哈。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL 删除百万数据重复项并保留一条的效率取决于多个因素。以下是一些可能影响效率的因素: 1. 索引的使用:如果表存在合适的索引,删除重复项的效率会更高。可以使用唯一索引或主键索引来确保数据的唯一性。 2. 数据库服务器的硬件性能:较高配置的服务器通常可以更快地处理大量数据操作。 3. 语句的优化:使用正确的 SQL 语句,如使用 WHERE 子句和 LIMIT 子句,可以减少查询的范围,提高效率。 4. 表的结构:表的大小和复杂性会影响删除操作的效率。如果表存在许多其他索引或触发器,可能会严重影响性能。 5. 事务处理:在删除大量数据时,使用事务可以提高效率。通过合理地使用事务并批量处理数据,可以减少数据库锁定和日志写入的次数,从而提高删除操作的效率。 然而,在百万别的数据删除重复项可能是一个耗时的操作,因为需要扫描整个表并对每个重复项进行删除。对于大型数据集,可能需要更多的时间来完成操作。为了提高效率,可以考虑以下方法: 1. 创建一个临时表:将原始表数据复制到一个新的临时表,并设置适当的索引。然后,通过使用 GROUP BY 子句和聚合函数,选择要保留的唯一记录。最后,将临时表的数据插入到原始表,完成删除重复项的操作。 2. 使用临时存储过程:创建一个临时存储过程,通过使用游标和循环来逐行处理数据。在处理每一行时,检查是否有重复项,并删除多余的记录。 在实际应用,根据具体需求和数据量的大小,可以进行适当的优化和测试,以找到最有效的方法来删除重复项并保留一条

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老周聊架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值