MySQL如何排查和删除重复数据

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 该文章介绍了在MySQL中如何排查和删除重复数据的方法,包括通过组合字段生成唯一标识符以及使用子查询和聚合函数来定位并删除重复记录的具体步骤。

原理:MySQL多字段去重复实际上是单字段去重复的衍生,大致步骤如下:
1、把多字段数据通过子查询合并为单字段的数据表;
2、再通过单字段数据group by进行汇总;
3、用 having把 count(字段) > 1的数据都显示出来
4、最后把查找到的重复数据用min方法或者max方法获取最小id或者最大id来选择删除。

1、多字段转单字段

将去重相关的多个字段转成单字段,这里需要把id显示出来,后面有用到

SELECT id,CONCAT(`host`,path, params) AS uuid FROM table_name;

如果根据单字段去重,则按下方查询即可

SELECT id,CONCAT(path) AS uuid FROM table_name;

2、显示重复数

将查询结果放入子查询,查找存在重复的数据,并显示重复数

SELECT COUNT(a.id),a.uuid FROM (
    SELECT id,CONCAT(`host`,path,params) AS uuid FROM table_name
) a GROUP BY a.uuid HAVING COUNT(a.id) > 1;

3、获取重复数据的最小id

来获取重复数据里最小的id (如果要删除最大id的话,可以改成max(a.id) )

SELECT min(a.id) FROM (
     SELECT id,CONCAT(`host`,path,params) AS uuid FROM table_name
) a GROUP BY a.uuid HAVING COUNT(a.id) > 1;

4、删除数据

将获取到重复数据最小的id值放入 IN内作为删除数据的条件

DELETE FROM table_name WHERE id IN(
    SELECT min(a.id) FROM (
        SELECT id,CONCAT(`host`,path,params) AS uuid FROM table_name
    ) a GROUP BY a.uuid HAVING COUNT(a.id) > 1
);

5、bug补充

如果直接执行步骤4的代码时,MySQL会卡住,会卡住,卡住,住!

逻辑上来说上面SQL没问题,但执行的时候嵌套过多子查询,就会卡住,重复数据过多时子查询数据拎出来再放入删除语句内较为合适

DELETE FROM table_name WHERE id IN(91383,26240,265,37459,32493,32417);

6、将步骤4的代码多执行几次

直到执行结果显示没有删除到数据的时候才停止,因为重复数据不一定只重复一次,很可能重复好几次,每一次执行只能删除重复数据的最小id,不是只保留最大id

7、彻底解决无重复数据插入问题

将去重数据加入唯一索引,如下面案例:

ALTER TABLE table_name ADD UNIQUE KEY(link_url);

这时就不会有重复数据产生了。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
关系型数据库 MySQL Java
【MySQL+java+jpa】MySQL数据返回项目的感悟
【MySQL+java+jpa】MySQL数据返回项目的感悟
23 1
|
7天前
|
SQL 监控 关系型数据库
MySQL怎么全局把一张表的数据回滚
MySQL怎么全局把一张表的数据回滚
30 2
|
4天前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
21 3
|
2天前
|
关系型数据库 MySQL 数据库
mysql 里创建表并插入数据
【10月更文挑战第5天】
20 1
|
5天前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
18 3
|
7天前
|
SQL 关系型数据库 MySQL
MySQL 更新1000万条数据和DDL执行时间分析
MySQL 更新1000万条数据和DDL执行时间分析
21 4
|
7天前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
【10月更文挑战第1天】使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
27 3
|
4天前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
22 0
|
4天前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
16 0
|
4天前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
19 0