删除MySQL数据库重复数据保留一条
2021/10/26 19:39:36
本文主要是介绍删除MySQL数据库重复数据保留一条,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在开发中,遇到了多次需要删除重复数据并且根据条件保留一条的情况,因此就做个总结。
以此表为例:
-- 用户表 create table t_user ( id bigint auto_increment primary key, name varchar(20) not null, password varchar(20) not null, lessee_id int not null ) comment '用户表'; create index idx_name on t_user (name);
原始数据:
三种方式
目标:删除重复数据,保留ID最大的一条-- 第一种 DELETE t1 FROM t_user t1, t_user t2 WHERE t1.lessee_id = t2.lessee_id AND t1.name = t2.name AND t1.id < t2.id; -- 第二种 delete from t_user where id not in ( (select t1.max_id from (select max(id) as max_id from t_user group by name, lessee_id having count(1) > 1) t1)) and (lessee_id, name) in (select t2.lessee_id, t2.name from (select lessee_id, name from t_user group by name, lessee_id having count(1) > 1) t2); -- 第三种 delete from t_user where id not in (select * from (select max(id) from t_user group by name, lessee_id) t2);
效率对比
往表中插入测试数据:
DELIMITER $$ CREATE PROCEDURE pro_copy() BEGIN SET @i=1; -- 起始 WHILE @i<=500000 DO INSERT INTO t_user(NAME,password,lessee_id) VALUES(CONCAT('user',@i),'123',5); -- 拼接USER 和i值 SET @i=@i+1; -- 防止成为死循环 END WHILE; -- 结束循环 END $$ -- 结束自定义结束符 DELIMITER ; call pro_copy(); -- 调用函数
方式 |
20w数据去重耗时(name无索引) |
50w数据去重耗时(name有索引) |
第一种 |
3min以上 |
3s 523ms 左右 |
第二种 |
6s 172ms 左右 |
16s 726ms 左右 |
第三种 |
3s 868ms 左右 |
13s 656ms 左右 |
结论
在查询条件有索引的情况下,选择第一种去重方式,没有索引的情况下选择第三种。
这篇关于删除MySQL数据库重复数据保留一条的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-23BinLog入门:新手必读的MySQL二进制日志指南
- 2024-10-23Binlog入门:MySQL数据库的日志管理指南
- 2024-10-22MySQL数据库入门教程:从安装到基本操作
- 2024-10-22MySQL读写分离入门教程:轻松实现数据库性能提升
- 2024-10-22MySQL分库分表入门教程
- 2024-10-22MySQL慢查询的诊断与优化指南
- 2024-10-22MySQL索引入门教程:快速理解与应用指南
- 2024-10-22MySQL基础入门教程:从安装到基本操作
- 2024-10-22MySQL数据库中的Binlog详解与操作教程
- 2024-10-12部署MySQL集群项目实战:新手入门教程