文档章节

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

一个灰
 一个灰
发布于 2018/10/15 14:43
字数 892
阅读 300
收藏 6

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

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

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

导入Excel表

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

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

读取表头

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

循环处理数据

for (let record of data) {
}

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

写入数据库

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

© 著作权归作者所有

一个灰
粉丝 28
博文 33
码字总数 21699
作品 3
南京
高级程序员
私信 提问
你应该避免的3个Javascript性能错误(译)

如果我告诉你,你知道的一切都是假的,如果你学的一些近几年发布的深受喜爱的 ECMAScript 的主要特性,是很容易导致性能问题的,会发生什么。 故事发生在几年前,让我们回到 ES5 的天真时代....

winty
07/02
0
0
学习Node.js的电子书大全

在这里,与大家分享一批很有用的 Node.js 的电子书资源。Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写...

jay603
06/21
0
0
10个最佳Node.js企业应用案例:从Uber到LinkedIn

译者按: Node.js 8已经发布了,NPM模块每周下载量早已超过10亿,从Uber到LinkedIn都在使用Node.js,谁说JavaScript不能写后台? 原文: 10 best Node.js app examples for enterprises, with ...

Fundebug
2017/06/12
0
0
NodeJS优缺点及适用场景讨论

本文就个人使用经验对这些问题进行探讨。 一. NodeJS的特点 我们先来看看NodeJS官网上的介绍: Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, sc...

liuhao_sh
2015/08/13
0
0
在Windows 10平台上下载、安装和测试nodejs

Node是一个服务器端 JavaScript 解释器,它可以帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。下面就来介绍如何在Windows平台上下载...

宋国君
2017/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php 遇到 No input file specified的解决方法

(一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi.force_redirect = 1 去掉前面分号,把后面的1...

chenhongjiang
今天
5
0
MySQL 基础

一、常用命令 在命令行中,配置好环境变量后,通过cmd可以直接进入mysql命令行模式,同时列举几种常用命令 # 进入mysql数据库,密码可以先不写,打完-p后再输入,防止被别人看到mysql -u账...

华山猛男
今天
6
0
简单的博客系统(四)Django请求HTML页面视图信息--基于函数的视图

1. 编写用于查询数据的功能函数 应用目录 下的 views.py 文件通常用于保存响应各种请求的函数或类 from django.shortcuts import renderfrom .models import BlogArticles# Create your ...

ZeroBit
今天
5
0
用脚本将本地照片库批量导入到Day One中

因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤...

在山的那边
昨天
19
0
jupyter部署安装

python373 -m ipykernel install --name python373 ipython kernelspec list sc create myjupyterservice binpath="D:\apply\Python373\Scripts\jupyter-notebook --config=V:/my_work/jupyt......

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部