问题:card 表的 card_number 字段忘记加唯一约束,造成大量数据重复,需要去重。

1 测试数据准备

创建表1

2

3

4

5

6CREATE TABLE `card` (

`card_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',

`card_number` varchar(100) DEFAULT NULL COMMENT '卡号',

`other_field` varchar(100) DEFAULT NULL COMMENT '其它字段',

PRIMARY KEY (`card_id`)

) ENGINE=InnoDB AUTO_INCREMENT=142665 DEFAULT CHARSET=utf8;

新建存储过程,准备 10 万条数据1

2

3

4

5

6

7

8

9

10

11

12

13

14

15DROP PROCEDURE IF EXISTS proc1;

DELIMITER $$

SET AUTOCOMMIT = 0$$

CREATE PROCEDURE proc1()

BEGIN

DECLARE v_cnt DECIMAL (10) DEFAULT 0 ;

dd:LOOP

INSERT INTO card (card_number, other_field) VALUES (UUID(), UUID());

COMMIT;

SET v_cnt = v_cnt+1 ;

IF v_cnt = 100000 THEN LEAVE dd;

END IF;

END LOOP dd ;

END;$$

DELIMITER ;

调用存储过程1call proc1;

执行完存储过程后检查数据条数1select count(card_id) from card;

构建 1 万条卡号重复的数据(大概10%重复)1

2

3

4insert into card(card_number) select card_number from card limit 5000;

commit;

insert into card(card_number) select card_number from card limit 5000;

commit;

2 检测重复数据

查询重复的卡号及其重复条数1select card_number, count(card_number) as count from card group by card_number having count(card_number) > 1;

3 数据去重

3.1 方案一:离线执行

离线执行:在执行去重数据期间,其它程序不对 card 表做增删改操作。

思路:将所有数据导入一张结构与其一样的空的临时表,但临时表需先建立重复字段的唯一索引,然后导入数据时,忽略错误,达到去重的效果。最后修改表名即可。

新建临时表 card_temp1

2

3

4

5

6CREATE TABLE `card_temp` (

`card_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',

`card_number` varchar(100) DEFAULT NULL COMMENT '卡号',

`other_field` varchar(100) DEFAULT NULL COMMENT '其它字段',

PRIMARY KEY (`card_id`)

) ENGINE=InnoDB AUTO_INCREMENT=142665 DEFAULT CHARSET=utf8;

在临时表中为卡号添加唯一索引1alter table card_temp add unique index(card_number);

将 card 表的数据导入 card_temp 表,但重复的则忽略1

2insert ignore into card_temp(card_id, card_number, other_field) select card_id, card_number, other_field from card order by null;

commit;

TIPS:实际测试,50万条数据,40秒左右。若数据量达百万级以上,建议分批执行。

检查临时表数据条数1select count(card_id) from card_temp;

修改表名称1

2alter table card rename to card_old;

alter table card_temp rename to card;

确认无误后删除旧数据表1drop table card_old;

3.2 方案二:在线执行

在线执行:在执行去重数据期间,其它程序可以对 card 表做增删改操作。

3.2.1 通过中间表

思路:将需保留的重复的数据导入一张结构与其一样的空的临时表,但临时表需先建立重复字段的唯一索引,确保数据无误,然后通过比对原始表,删除多余的重复数据。最后修改原始表的索引即可。

新建临时表 card_temp1

2

3

4

5

6CREATE TABLE `card_temp` (

`card_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',

`card_number` varchar(100) DEFAULT NULL COMMENT '卡号',

`other_field` varchar(100) DEFAULT NULL COMMENT '其它字段',

PRIMARY KEY (`card_id`)

) ENGINE=InnoDB AUTO_INCREMENT=142665 DEFAULT CHARSET=utf8;

在临时表中为卡号添加唯一索引1alter table card_temp add unique index(card_number);

在 card 表中为 card_number 建立普通索引,为后面优化去重效率1alter table card add index (card_number);

检查语句的消耗1

2

3

4explain insert into card_temp

select b.card_id, a.card_number, a.other_field

from card a inner join (select max(card_id) card_id from card group by card_number having count(card_id)>1 order by null) b

on a.card_id = b.card_id;

将 card 表需保留的重复数据导入 card_temp 表1

2

3

4

5insert into card_temp

select b.card_id, a.card_number, a.other_field

from card a inner join (select max(card_id) card_id from card group by card_number having count(card_id)>1 order by null) b

on a.card_id = b.card_id;

commit;

检查删除语句的消耗1explain delete a.* from card a, card_temp b where b.card_number = a.card_number and a.card_id < b.card_id;

删除 card 表重复的数据1

2delete a.* from card a, card_temp b where b.card_number = a.card_number and a.card_id < b.card_id;

commit;

TIPS:实际测试,50万条数据,20秒左右。若数据量达百万级以上,建议分批执行。

在 card 表中为 card_number 删除普通索引,并建立唯一索引,防止数据再次重复1

2alter table card drop index card_number;

alter table card add unique index(card_number);

确认无误后删除临时表1drop table card_temp;

3.2.2 直接删除

即时统计并删除1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18DELETE a

FROM

card a

JOIN (

SELECT

card_number,

count(card_number) AS count,

max(card_id) AS card_id

FROM

card

GROUP BY

card_number

HAVING

count(card_number) > 1

) b ON a.card_number = b.card_number

WHERE

a.card_id < b.card_id;

commit;

一千万条数据去重_Mysql千万级数据快速去重相关推荐

  1. 利用python处理两千万条数据的一些经验(仅供自己记录)

    5.3老板交给我一个任务,简单处理一些数据,三个CSV文件,每个都是2.3G大小,以下是要求 看着觉得很easy,兴冲冲地去搞了,当时还是用的notepad++写python代码,对于python来说 ...

  2. MySQL 快速批量创建千万条数据 千万级数据

     MySQL 快速批量创建千万条数据 千万级数据 一.实现思路 1.创建一张users表,数据库引擎调整为: MyISAM 2.使用存储过程实现,用循环语句,批量插入1kw次.( WHILE ... ...

  3. insert批量插入500ms_如何快速安全的插入千万条数据

    作者:ksfzhaohui 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文 ...

  4. 如何快速安全的插入千万条数据?

    最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...

  5. 对一千万条数据进行排序---编程珠玑第二版 第一章

    本书第一章提出了一个看似简单的问题,有最多1000万条不同的整型数据存在于硬盘的文件中,如何在1M内存的情况下对其进行尽可能快的排序. 每个数字用4byte,1M即可存储250 000个数据,显然,只 ...

  6. mysql如何快速插入一千万条数据_如何快速安全的插入千万条数据?

    最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...

  7. Java千万数据导入mysql_java之5分钟插入千万条数据

    虽说不一定5分钟就插入完毕,因为取决去所插入的字段,如果字段过多会稍微慢点,但不至于太慢.10分钟内基本能看到结果. 之前我尝试用多线程来实现数据插入(百万条数据),半个多小时才二十多万条数据. 线程 ...

  8. 千万条数据,Stack Overflow是如何实现快速分页的

    转载自 千万条数据,Stack Overflow是如何实现快速分页的 Stack Overflow 在分页机制中使用页码代替偏移量,页码指向基于 LIMIT 和 OFFSET 的查询.假设要对 100 ...

  9. mysql插10万条数据_如何快速安全的插入千万条数据?

    点击上方 小伟后端笔记 ,选择 星标 公众号 重磅资讯.干货,第一时间送达 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半 ...

  10. 使用MySQL可视化客户端,例如SQLyog,Navicat等,只编写SQL语句,使用2的N次方原理,快速初始化百万千万条数据

    目录 1.思路 2.创建表 3.具体操作 4.其他快速插入百万条数据的方法 4.1Java代码批量插入 4.2存储过程批量插入 1.思路 使用MySQL可视化客户端,例如SQLyog,Navicat ...

最新文章

  1. Synchronized的两个用法
  2. Spring应用注解配置实现IOC
  3. Windows下LATEX排版论文攻略—CTeX、JabRef使用心得
  4. 之江杯2020零样本目标分割题参赛总结
  5. VTK:图像透明度用法实战
  6. Linux环境下压缩与解压命令大全
  7. java学习(14):java命名规范
  8. 开关电源雷击浪涌整改_雷击浪涌的防护解析!
  9. mysql如何撤销上一条指令_mysql命令行,多行命令时如何取消/返回修改前边的命令...
  10. Bailian4120 硬币【0-1背包】
  11. 在AIX系统下查询硬件信息的方法
  12. python mysql connector
  13. codevs——T1048 石子归并
  14. math_Taylor_常见幂级数展开
  15. 解决Provisional headers are shown问题
  16. Linux系统编程 —线程属性
  17. 科大奥锐干涉法测微小量实验的数据,大学物理实验报告答案大全(实验数据)
  18. python批量分析表格_老板让我从几百个Excel中查找数据,我用Python一分钟搞定!...
  19. 集团化公司快递收发管理教程
  20. 基于Python的微信朋友圈数据可视化分析之地点

热门文章

  1. php神策数据统计,神策数据
  2. 如何卸载计算机强行安装游戏,如何卸载和重新安装《炉石传说》
  3. 二次开发发票管理软件应该注意的事项
  4. 网上书店 China-pub和第二书店
  5. K8s之Pod的健康检查
  6. 洛蒙德湖风景mac动态壁纸
  7. MATLAB实现利用图像深度信息合成不同浓度的雾【Cityscapes_foggy数据集】
  8. 计算机专业事业单位类别,信息管理与信息系统专业在事业单位考试中属于什么专业类别...
  9. 【pytorch】——torch.hub
  10. python海伦公式求三角形面积_python编程实战:海伦公式求取三角形的面积