将excel文件中数据导入数据库中,表结构中已存有20W笔数据,需将数据排重后存入数据库

问题描述:
将excel文件中数据导入数据库中,数据库表结构中已存有20W笔数据,需将数据排重后存入数据库(excel表结构与数据库表结构一致)。

1.创建表结构
CREATE TABLE test (
id bigint(255) NOT NULL,
c1 varchar(25) DEFAULT NULL,
c2 varchar(25) DEFAULT NULL,
c3 varchar(25) DEFAULT NULL,
c4 varchar(25) DEFAULT NULL,
c5 varchar(25) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
将excel文件中数据导入数据库中,表结构中已存有20W笔数据,需将数据排重后存入数据库

2.通过存储过程创建20W条测试数据
在Navicat Premium 12中选择工具栏函数->新建函数->过程->完成即可
CREATE DEFINER=root@localhost PROCEDURE NewProc()
BEGIN
DECLARE i int;
SET i = 0;
while i <= 200000 DO
INSERT INTO test(id,c1,c2,c3,c4,c5) VALUES(i,CONCAT(‘c1’,i),‘c2’,‘c3’,‘c4’,‘c5’);
SET i = i+1;
end while;
END
将excel文件中数据导入数据库中,表结构中已存有20W笔数据,需将数据排重后存入数据库

将excel文件中数据导入数据库中,表结构中已存有20W笔数据,需将数据排重后存入数据库
根据主键查询所有数据所需要的时间:
将excel文件中数据导入数据库中,表结构中已存有20W笔数据,需将数据排重后存入数据库
解决方案一:
首先最直接的想法是,将20W条数据ID全部查出来,然后与excel中的数据作对比,id一样的就不插入到数据库中。
可行性分析:
根据主键查询20W数据需要0.137s,然后遍历excle中的数据查看当前数据是否在20W笔数据中,如果不在进行插入,如果在就不进行插入(具体所需时间未计算,单条数据最多需进行20W次遍历,最少进行一次遍历)。

解决方案二:
假设数据库中的ID是整数递增的(不一定连续),可以创建一个长度为ID最大值(不一定是20W,因为ID递增但不一定连续)的byte数组,将从数据库中查询到的ID值对应的放到byte数组中(比如ID为1的有数据,就将byte数组第一位置为1),然后取出byte数组为0的数组位置,这些为0的说明数据库中没有与之对应的数据,如果excel中有对应的数据,就可以直接插入,其余byte数组位置为1的,如果有excel有数据,则为重复数据,不进行插入。

待续。。。。。。。
欢迎大家指正以及提供个人想法。