我们用的数据库是mysql,偶尔会因为程序处理上的方便或者sql未优化而增加了一些重复数据,最后需要对这些重复的数据进行删除

对于数据量不大的时候我一般用not in的方式来处理,或者删全表,导出不重复的数据,然后再insert的方式,网上也提供了很多方式,但是很多都需要执行很长时间,而且资源占用很多,对于数据量大的时候被DBA否决了

比如表tb1中的结构为

id    param1    param2    param3    date

其中id为主键,param为需要去重的项

一、not in的方式(可以用一条sql或者用脚本来处理,但是一条sql会执行时间太长)

DELETE FROM tb1 WHERE id not in (SELECT id FROM tb1 GROUP BY param1, param2, param3);

或者当数据量大的时候,一维或者多维分步操作

DELETE FROM tb1 WHERE param1='param1' AND id not in (SELECT id FROM tb1 WHERE param1='param1' GROUP BY param1, param2, param3);

notin的方式我在冗余时数据总量在百万级的时候,好像还行,问题也不是很大,但是当上千万量级的时候,DBA就开始过来找我了

二、删除数据,然后插入distinct数据

SELECT param1, param2, param3, date FROM tb1 GROUP BY param1, param2, param3;

DELETE FROM tb1;

INSERT INTO tb1 (param1, param2, param3, date) VALUES ......

DBA不太同意我这种方式

DBA建议我用in的方式,于是我就想到了用shell进行处理

三、用shell脚本帮忙筛选然后用主键in的方式来删除

SELECT id FROM tb1 GROUP BY param1, param2, param3 > ids.csv

SELECT id FROM tb1 >> ids.csv

cat ids.csv|sort|uniq -c| awk '{if($1==1) print $2}' > delete_ids.csv

DELETE FROM tb1 WHERE id IN delete_ids

或者分维度处理也行,减小数据库压力

这种方式ids.csv文件中先输入了去重param1,param2,param3的id,然后再把所有id再次加入进去,这样我们需要保留的id的count就为2了,利用shell的sort和uniq工具,就可以筛选出来需要delete掉的id了,于是大功告成了,

我采用的是分一个维度来删的(也就是分不同的param1来处理),最终1.2y数据中删除4kw的冗余,轻轻松松就解决掉了,DBA毫无压力(param1建了索引)

mysql count if 去重_MYSQL数据去重相关推荐

  1. mysql数据去重_mysql 数据去重

    数据库版本mysql5.5.10  操作工具navicate for mysql 插入数据重复了   用mysql语句去重 --  查询数量是否大于1 大于1  表示有重复数据 SELECT  cou ...

  2. oracle 多条件去重,Oracle数据去重

    Oracle数据去重保留一条 多个条件分组 delete from M_BASEPRICE_0719_CC m where (m.brand_code,m.supplier_code,m.part_c ...

  3. postgresal去重_PostgreSQL数据去重

    数据库中去重的需求比较常见,比较常见的如单列去重.多列去重.行去重等.pg中针对这些不同的去重要求,我们也可以使用不同的去重方法.https://www.cndba.cn/foucus/article ...

  4. mysql去重查询数量_mysql 数据去重

    数据库版本mysql5.5.10  操作工具navicate for mysql 插入数据重复了   用mysql语句去重 --  查询数量是否大于1 大于1  表示有重复数据 SELECT  cou ...

  5. mysql合并表快速去重_MySQL数据表合并去重的简单实现方法

    场景: 爬取的数据生成数据表,结构与另一个主表相同,需要进行合并+去重 解决:(直接举例) 首先创建两个表pep,pep2,其中pep是主表 CREATE TABLE IF NOT EXISTS `p ...

  6. mysql降序后去重_Mysql 数据记录去重后按字段排序

    实现效果:去重-取最新的-排序 例子 : 按用户ID获取历史记录中某个人的记录,要求非重复的且每条只获取最新的,同时按添加时间倒序排列的 实现 :SELECT * FROM ( SELECT * FR ...

  7. mysql搜索结果去重_mysql数据库去重查询

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. mysql count忽略空_MySQL count 过滤空值,使其不将空数据计入条数

    首先,看如下两个查询语句: 第一种 SELECT t.id, t.meetStyle, t.title, count(p.id) AS personCount, count(f.id) AS file ...

  9. mysql count 不等于_Mysql 不同的 count 区别

    不同 count 的区别: count(*).count(主键 id)和 count(1) 都表示返回满足条件的结果集的总行数:而 count(字 段), 则表示返回满足条件的数据行里面,参数&quo ...

最新文章

  1. 2019数据安装勾选_万能的XY数据标签插件,柱形图也可以呈现变化率
  2. AI 名校课程书籍 需要学习
  3. [Unity3d]多个摄像机叠加效果
  4. 什么是多核电脑?什么是64位电脑?
  5. Java折叠_[Java教程]Jquery中菜单的展开和折叠
  6. SAP License:SAP顾问是如何炼成的——SAP顾问的定义
  7. 解析ip数据包java_ip包,ip数据包,数据包或者包的理解
  8. New Adventure----GUI Design Studio
  9. 单片机c51语言实训总结,单片机实训报告
  10. 【NiosII训练】第一篇、FPGA驱动AD9854基础篇
  11. C. Make it Increasing
  12. 可视化图表告诉你,《人世间》《余生,请多指教》到底爆没爆?
  13. AD根据Primitives进行敷铜
  14. 科技爱好者周刊(第 114 期):U 盘化生存和 Uber-job
  15. M401a armbian下安装cups共享打印机
  16. Spring源码解析三
  17. 公司想要创建百度百科词条应该怎么做?
  18. 内存或者 cpu 占用率过高如何排查
  19. 如何用uni-app做一个领优惠券H5、小程序商城(二)
  20. 【oracle作业3】数据库查询与内置函数

热门文章

  1. sqlserver存储过程的参数传递注意事项
  2. 滴滴开源Android插件化框架VirtualAPK原理分析
  3. 时间序列相关算法与分析步骤
  4. 反调试检测之一TracerPid
  5. 深度学习利器: TensorFlow系统架构及高性能程序设计
  6. Activity到底是什么时候显示到屏幕上的呢
  7. 两种AIDL用法分析(原)
  8. 线程间通讯机制(提高篇)——深入浅出实现原理
  9. 爱加密Android APk 原理解析
  10. ARM64的启动过程之(五):UEFI