Node.js一次处理10万条数据

电话销售大家一定都经历过,许多公司都有电销的团队,相信看过华尔街之狼的人肯定会理解的更加深刻。我们今天不讨论那些公司是如何通过各种渠道获取到大众的电话号码的。我有幸开发了一个需要处理海量电话号码的系统,这个系统的功能包括:

  1. 一次导入10万条Excel数据
  2. 对数据进行筛选去重写入数据库
  3. 可对复杂查询条件筛选出数据
  4. 导出数据到Excel表格
  5. 根据条件修改数据的字段

目的是从海量的数据中分配给电销团队电话号码,同时跟踪使用过的电话,包括初次拨打,以及有意愿成交等等,需要记录数据用于考核业绩。 下面我们就介绍一下如何一次性处理10万条数据,写入MySQL。

导入Excel表

我们使用一个npm包来解析Excel

1import xlsx from 'node-xlsx'; 2let data = xlsx.parse(file.buffer)[0].data

读取表头

let header = data.shift() //第一行是表头

循环处理数据

1for (let record of data) { 2}

此处省略对数据的预处理。

写入数据库

对于10万条数据来说,如果用普通的insert语句处理,那么处理时间会非常长。这对于客户来说是不能接受的。Oracle有批量insert,但MySQL却没有。那么如何才能快速插入10万条数据呢?还要去重! 关于去重,我们需要建立临时表。

所以我们先执行CREATE TABLE 语句创建我们需要的临时表,结构与真实表相同。 然后就是关键一步,我们不使用insert语句插入,而是通过一个命令:

`LOAD DATA LOCAL INFILE '${dbFilePath}source.txt' INTO TABLE ${table_source} FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (origin_index,${header})`

这个命令可以把一个文本文件瞬间导入到数据库中,速度极快。 没错,这个文本文件需要我们事先在循环的时候写入磁盘,我们可以边循环边写入,边处理数据边写入磁盘。 原本需要20分钟以上的插入变成了秒级。

去重

当然插入到临时表还不算完成任务。还需要让临时表里面的数据合并到真实表中。 要保持数据的一致性,我们需要使用事务处理,一旦出错就会回滚。

首先,我们需要找到重复的手机号码,并写入一个临时表中

insert into repetition select a.phone from ${table_source} a ,resource b where a.phone = b.phone

其中a表是临时表,b表是真实表,我们得到一个repetition表,里面放着重复的手机号码。 然后我们通过insert语句加上子查询来插入去重后的数据到真实表中。

insert into resource(...) select ... from  ${table_source} where phone not in (select phone from repetition)

phone字段一定要使用索引,否则效率将会大打折扣。有了索引以后,这样的子查询速度并不慢,最终整个过程的时间控制在可以接受的范围内。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )