一千万条数据去重_Mysql千万级数据快速去重
问题: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千万级数据快速去重相关推荐
- 利用python处理两千万条数据的一些经验(仅供自己记录)
5.3老板交给我一个任务,简单处理一些数据,三个CSV文件,每个都是2.3G大小,以下是要求 看着觉得很easy,兴冲冲地去搞了,当时还是用的notepad++写python代码,对于python来说 ...
- MySQL 快速批量创建千万条数据 千万级数据
MySQL 快速批量创建千万条数据 千万级数据 一.实现思路 1.创建一张users表,数据库引擎调整为: MyISAM 2.使用存储过程实现,用循环语句,批量插入1kw次.( WHILE ... ...
- insert批量插入500ms_如何快速安全的插入千万条数据
作者:ksfzhaohui 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文 ...
- 如何快速安全的插入千万条数据?
最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...
- 对一千万条数据进行排序---编程珠玑第二版 第一章
本书第一章提出了一个看似简单的问题,有最多1000万条不同的整型数据存在于硬盘的文件中,如何在1M内存的情况下对其进行尽可能快的排序. 每个数字用4byte,1M即可存储250 000个数据,显然,只 ...
- mysql如何快速插入一千万条数据_如何快速安全的插入千万条数据?
最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...
- Java千万数据导入mysql_java之5分钟插入千万条数据
虽说不一定5分钟就插入完毕,因为取决去所插入的字段,如果字段过多会稍微慢点,但不至于太慢.10分钟内基本能看到结果. 之前我尝试用多线程来实现数据插入(百万条数据),半个多小时才二十多万条数据. 线程 ...
- 千万条数据,Stack Overflow是如何实现快速分页的
转载自 千万条数据,Stack Overflow是如何实现快速分页的 Stack Overflow 在分页机制中使用页码代替偏移量,页码指向基于 LIMIT 和 OFFSET 的查询.假设要对 100 ...
- mysql插10万条数据_如何快速安全的插入千万条数据?
点击上方 小伟后端笔记 ,选择 星标 公众号 重磅资讯.干货,第一时间送达 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半 ...
- 使用MySQL可视化客户端,例如SQLyog,Navicat等,只编写SQL语句,使用2的N次方原理,快速初始化百万千万条数据
目录 1.思路 2.创建表 3.具体操作 4.其他快速插入百万条数据的方法 4.1Java代码批量插入 4.2存储过程批量插入 1.思路 使用MySQL可视化客户端,例如SQLyog,Navicat ...
最新文章
- Synchronized的两个用法
- Spring应用注解配置实现IOC
- Windows下LATEX排版论文攻略—CTeX、JabRef使用心得
- 之江杯2020零样本目标分割题参赛总结
- VTK:图像透明度用法实战
- Linux环境下压缩与解压命令大全
- java学习(14):java命名规范
- 开关电源雷击浪涌整改_雷击浪涌的防护解析!
- mysql如何撤销上一条指令_mysql命令行,多行命令时如何取消/返回修改前边的命令...
- Bailian4120 硬币【0-1背包】
- 在AIX系统下查询硬件信息的方法
- python mysql connector
- codevs——T1048 石子归并
- math_Taylor_常见幂级数展开
- 解决Provisional headers are shown问题
- Linux系统编程 —线程属性
- 科大奥锐干涉法测微小量实验的数据,大学物理实验报告答案大全(实验数据)
- python批量分析表格_老板让我从几百个Excel中查找数据,我用Python一分钟搞定!...
- 集团化公司快递收发管理教程
- 基于Python的微信朋友圈数据可视化分析之地点
热门文章
- php神策数据统计,神策数据
- 如何卸载计算机强行安装游戏,如何卸载和重新安装《炉石传说》
- 二次开发发票管理软件应该注意的事项
- 网上书店 China-pub和第二书店
- K8s之Pod的健康检查
- 洛蒙德湖风景mac动态壁纸
- MATLAB实现利用图像深度信息合成不同浓度的雾【Cityscapes_foggy数据集】
- 计算机专业事业单位类别,信息管理与信息系统专业在事业单位考试中属于什么专业类别...
- 【pytorch】——torch.hub
- python海伦公式求三角形面积_python编程实战:海伦公式求取三角形的面积