电话销售你们必定都经历过,许多公司都有电销的团队,相信看过华尔街之狼的人确定会理解的更加深入。咱们今天不讨论那些公司是如何经过各类渠道获取到大众的电话号码的。我有幸开发了一个须要处理海量电话号码的系统,这个系统的功能包括:node
目的是从海量的数据中分配给电销团队电话号码,同时跟踪使用过的电话,包括初次拨打,以及有意愿成交等等,须要记录数据用于考核业绩。 下面咱们就介绍一下如何一次性处理10万条数据,写入MySQL。sql
咱们使用一个npm包来解析Excel数据库
import xlsx from 'node-xlsx'; let data = xlsx.parse(file.buffer)[0].data
let header = data.shift() //第一行是表头
for (let record of data) { }
此处省略对数据的预处理。npm
对于10万条数据来讲,若是用普通的insert语句处理,那么处理时间会很是长。这对于客户来讲是不能接受的。Oracle有批量insert,但MySQL却没有。那么如何才能快速插入10万条数据呢?还要去重! 关于去重,咱们须要创建临时表。code
因此咱们先执行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分钟以上的插入变成了秒级。事务
固然插入到临时表还不算完成任务。还须要让临时表里面的数据合并到真实表中。 要保持数据的一致性,咱们须要使用事务处理,一旦出错就会回滚。开发
首先,咱们须要找到重复的手机号码,并写入一个临时表中it
insert into repetition select a.phone from ${table_source} a ,resource b where a.phone = b.phone
其中a表是临时表,b表是真实表,咱们获得一个repetition表,里面放着重复的手机号码。 而后咱们经过insert语句加上子查询来插入去重后的数据到真实表中。io
insert into resource(...) select ... from ${table_source} where phone not in (select phone from repetition)
phone字段必定要使用索引,不然效率将会大打折扣。有了索引之后,这样的子查询速度并不慢,最终整个过程的时间控制在能够接受的范围内。