文章浏览 复制本页面地址

大数据查询去除重复500万条适用---比较高效

最近在搞数据库输入查询重复去重功能,由于是多个数据库表,所以只能借助中间表来处理,在数据表合并后大约有80多w 条数据,用网上一些not in 或者 子查询等等速度非常慢,这里我介绍下我的方法。

先说下需求:

表 A 字段  (email,phone)

表B 字段    (email,phone)

最后通过导入excel的数据 和 A,B两个表中的数据进行比对去重,然后把结果插入表B.

处理方法:

1、 创建 表C (id,email,phone)   id [int,自增,主键],把A表数据跟B表数据合并

insert into C (email,phone) select email,phone from A;

insert into C (email,phone) select email,phone from B;

2、 比如说按照手机号去重,创建临时表把C表中的数据ID小的保存下来,根据phone分组,为了效率更好可以在phone 上建立索引

create table tmp_tb_d as select min(id) as tmp_id from C group by phone;

这样我们就把较小的id的那条手机号保存下来了.

3、 关联tmp_tb_d 表把C表中的重复数据删除,同时把过滤后的数据插入到 目标 表  B

INSERT INTO B (email,phone) SELECT email,phone FROM C,tmp_tb_d where C.id=tmp_tb_d.tmp_id  and c.id > [这个ID是在 复制表B数据到C后的最后一条ID,你也可以不这么操作,但前提是需要复制完表B后清空它]

这里前两步骤花费时间也就在 10秒钟,第三步差不多2-3分钟.

完成后,你可以查看下表B里面是否还有重复的,你会发现答案是 NO。

select count(1),phone from C group by phone having count(1) > 1 ;

好啦,到这里可以收工了.

对了,在把数据导入时借助Mysql的CVS功能,可以写语句处理,当你想查看CVS的分隔符时候,你可以再CVS文件上右键用记事本打开,你会发现大部分是 ','

 

[code]

Linux 导入功能

LOAD DATA INFILE '/home/test/dump/ip_location.csv'
INTO TABLE ip_location
CHARACTER SET utf8
FIELDS TERMINATED BY ',' ENCLOSED BY '"';
--CHARACTER SET :mysql字符集,一定要加上,免去乱码麻烦
--INTO TABLE :导入到哪个表
--FIELDS TERMINATED BY :以什么作为分割符
-- ENCLOSED BY :被什么包围

[/code]
[code]

Windows 导入功能,盘符、文件夹不要带汉字。

LOAD DATA INFILE "d:/insert_data.csv"
REPLACE INTO TABLE DEMO
CHARACTER SET gb2312
FIELDS TERMINATED BY "," ENCLOSED BY ""
LINES TERMINATED BY "\r\n";
--LINES TERMINATED BY:这个与linux不同,以什么作为一行的结尾。

[/code]

好了,介绍到这里,我的方法是这样的,不过不一定是最优秀的,各位友好的方法,可以给我回复一起探讨,谢谢观赏。

标签:
上一篇:
下一篇: