前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >高效处理MySQL表中重复数据的方法

高效处理MySQL表中重复数据的方法

作者头像
修己xj
发布于 2023-08-25 03:38:13
发布于 2023-08-25 03:38:13
51100
代码可运行
举报
文章被收录于专栏:修己xj修己xj
运行总次数:0
代码可运行

MySQL数据库中,当我们面对一个拥有大量数据的表,并且需要删除重复数据时,我们需要采用高效的方法来处理。今天了我们正好有张表,大概3千万条数据,重复数据有近2千多万条,本文将介绍几种方法,帮助您删除MySQL表中重复的数据中。

场景描述

有张工单版本对应表bus_mark_plat_ver,表结构如下:

字段

类型

注释

id

int(10)

sys_code

varchar(20)

系统类型

version_code

varchar(50)

平台版本

mark_id

varchar(15)

工单id

这张表了有3千万条数,我们需要保留sys_code,version_code,mark_id 重复的数据中保留最大的id的数据,删除其余的数据。

方法一:使用临时表

  • 创建一个临时表,用于存储要保留的数据。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE bus_mark_plat_ver_tmp LIKE bus_mark_plat_ver;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO bus_mark_plat_ver_tmp
SELECT MAX(id) AS id,sys_code,version_code,mark_id
FROM mng_navigation_banner_plat_ver
GROUP BY sys_code, version_code, mark_id;
  • 删除原表中的数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delete from  bus_mark_plat_ver
  • 将临时表中的数据加入到原表中
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO bus_mark_plat_ver
SELECT  id,sys_code,version_code,mark_id
FROM mng_navigation_banner_plat_ver_tmp;
  • 删除临时表
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DROP TABLE bus_mark_plat_ver_tmp;

创建临时表的优点:

  • 简单直观:通过创建临时表,您可以明确地将要删除的数据和要保留的数据分开存储,易于理解和管理。
  • 可读性好:临时表的使用可以使查询语句更易读,特别是对于复杂的逻辑操作。
  • 可以灵活处理:临时表可以在多个查询之间使用,可以执行额外的操作,例如插入、更新或查询临时表的数据。

创建临时表的缺点:

  • 需要额外的存储空间:创建临时表需要占用额外的存储空间,特别是在处理大量数据时可能会对磁盘空间造成一定的压力。
  • 需要额外的操作及权限:创建、插入和删除临时表需要执行额外的数据库操作,增加了一定的复杂性。

方法二:使用left join 删除(强烈推荐)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE t1 
FROM
 bus_mark_plat_ver t1
 LEFT JOIN ( SELECT MAX( id ) AS max_id, sys_code, version_code, mark_id FROM bus_mark_plat_ver GROUP BY sys_code, version_code, mark_id ) t2 ON t1.sys_code = t2.sys_code 
 AND t1.version_code = t2.version_code 
 AND t1.mark_id = t2.mark_id 
 AND t1.id = t2.max_id 
WHERE
 t2.max_id IS NULL;

这个查询将根据sys_type、bus_type和mark_type进行分组,并保留每个组中的最大id。然后,它使用左连接将原始表与这些最大id进行比较。如果连接失败(即max_id为NULL),则表示该行不是具有最大id的行,因此将被删除。

LEFT JOIN的优点:

  • 可以利用索引:LEFT JOIN 可以利用索引来加速查询,特别是在连接字段上存在索引的情况下。
  • 更高的灵活性:LEFT JOIN 可以与其他表达式和条件组合使用,使得查询可以更加灵活。

LEFT JOIN的缺点:

  • 性能可能受限:当处理大量数据时,LEFT JOIN 可能会导致较慢的查询速度,尤其是在连接字段没有索引或使用了复杂的连接条件时。
  • 查询复杂度高:使用 LEFT JOIN 进行连接查询时,需要编写较为复杂的查询语句,对于新手而言可能会比较困难。

方法三:使用not in 删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE 
FROM
 bus_mark_plat_ver t1 
WHERE
 id NOT IN ( SELECT max_id FROM ( SELECT MAX( id ) AS max_id FROM bus_mark_plat_ver GROUP BY sys_code, version_code, mark_id ) tmp );

NOT IN的优点:

  • 简单易用:NOT IN 是一种直观简单的方式来筛选出不在指定列表中的数据。
  • 可读性好:NOT IN 子句的语义明确,易于理解和维护。

NOT IN的缺点:

  • 性能可能较低:NOT IN 子查询对于大型数据集可能会导致较慢的查询速度,尤其是在子查询中返回大量结果时。
  • NULL 值处理:NOT IN 子句在处理 NULL 值时需要特别注意,因为 NULL 的处理可能会导致意外的结果。

结论

根据具体情况选择最合适的方法。如果性能和存储空间是主要关注点,并且查询逻辑相对简单,可以考虑使用 LEFT JOIN 或 NOT IN 来处理重复数据。如果可读性和操作灵活性更重要,并且处理逻辑相对复杂,创建临时表可能是更好的选择。无论使用哪种方法,请务必在生产环境之前进行充分的测试和验证。我们在此推荐使用第二种方法来删除重复数据。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 修己xj 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【Git】Git 完全指南:从入门到精通
Git 是现代软件开发中最重要的版本控制工具之一,它帮助开发者高效地管理项目,支持分布式协作和版本控制。无论是个人项目还是团队开发,Git 都能提供强大的功能来跟踪、管理代码变更,并保障项目的稳定性与可持续发展。本篇文章从基础命令讲起,逐步深入,帮助你全面了解并掌握 Git,最终达到精通。
LuckiBit
2024/12/11
4.6K0
【Git】Git 完全指南:从入门到精通
Git Cheat 2
整理一下经常忘记的Git命令 (版本v2) http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html?utm_source=tool.lu
happy123.me
2018/06/04
5510
不会吧?你这些Git命令都不会~
1、设置与帮助 1. git help <command> # 显示指定命令的help 2. git config --global user.name "your name" 3. git config --global user.email "your email" 2、修改与提交 1. git status # 查看工作区状态 2. git add <file> # 将指定文件修改提交到本地暂存区 3.
chengcheng222e
2021/11/04
4460
Git常见命令与使用,从0到1学会使用Git
才疏学浅的木子
2023/10/17
1700
Git常见命令与使用,从0到1学会使用Git
Git 帮助手册
国外网友制作了一张 Git Cheat Sheet,总结很精炼,各位不妨收藏一下。
硬件开源小站
2023/04/07
4.4K1
Git 帮助手册
git 命令大全
阮一峰 git 学习 :https://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
xyzzz
2020/12/12
6220
git 命令大全
Git-基本命令大全
Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库
腾讯工蜂
2018/11/07
1.4K0
开发中必须要掌握的 Git 技巧
本文是参考廖雪峰老师的Git资料再加上我自己对Git的理解,记录我的Git学习历程,作下此文是为以后学习,工作,开发中如果遇到问题可以回过头来参考参考。因为水平有限,难免会有出错的地方,欢迎指正。
Java团长
2019/08/15
6070
Git 常用命令清单笔记
这里是我的笔记,记录一些git常用和一些记不住的命令,这个笔记原本是基于 颜海镜的文章增加的,后面慢慢增加了许多内容,可以看出的的学习轨迹。分享出来方便自己查看,也许能帮助到你。
小弟调调
2018/09/11
7990
Git 常见命令及其命令组合
GeekLiHua
2024/08/22
1430
三年 Git 使用心得 & 常见问题整理
「使用场景:」 当你接到一个修复紧急 bug 的任务时候,一般都是先创建一个新的 bug 分支来修复它,然后合并,最后删除。但是,如果当前你正在开发功能中,短时间还无法完成,无法直接提交到仓库,这时候可以先把当前工作区的内容 git stash 一下,然后去修复 bug,修复后,再 git stash pop,恢复之前的工作内容。
Nealyang
2020/06/19
2.9K0
三年 Git 使用心得 & 常见问题整理
看了这篇文章,你应该可以应付工作中90%的git命令
安装完git 需设置账号和邮箱,用于标示用户身份,类似于svn的账号,但是git不存在服务器,所以无需密码验证身份。 保存位置C:\Users\yourname\\.gitconfig。
兜兜转转
2023/03/08
4560
Git常用操作指南
因为工作需求,最近又重新温习了一下Git操作,遂总结了一篇Git常用操作指南,方便日后学习查阅,本博客精简提炼了在开发过程中Git经常用到的核心命令,主要参考了《廖雪峰老师的Git教程》,希望对大家学习使用Git能带来帮助。
10JQKA
2019/07/22
8110
Git常用操作指南
Git命令语法汇总
本文是在学习廖雪峰Git教程后对常用Git命令的使用总结,仅供在使用Git时方便查找。 一、Git简介 Git是当前最为流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源
梧雨北辰
2018/04/24
9010
Git命令语法汇总
git学习总结03 — 分支管理
merge 分支合并有 fast-forward 和 no-fast-forward 两种模式。下图 dev 合入 master,默认触发快进模式(fast-forward),因为只需要修改指针即可实现合并;而普通模式(no-fast-forward)需要生成一个新的commit,因此即使 dev 分支删除,也能从 master 分支历史上看出分支合并信息。
CS逍遥剑仙
2020/05/30
1.5K0
Git关键命令总结
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。(个人体会:其实是把暂存区的版本还原到最近一次提交后的版本库的版本,相当于清空了readme.txt未提交的修改,暂存区现在不存在这个待提交修改,但工作区的文件不会受影响,可以再次add将该修改放到暂存区,也可以使用git checkout -- readme.txt将工作区的文件撤回到最近版本的状态
梦飞
2022/06/23
5760
Git关键命令总结
相关推荐
【Git】Git 完全指南:从入门到精通
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档