Node.js一次處理10萬條數據

電話銷售你們必定都經歷過,許多公司都有電銷的團隊,相信看過華爾街之狼的人確定會理解的更加深入。咱們今天不討論那些公司是如何經過各類渠道獲取到大衆的電話號碼的。我有幸開發了一個須要處理海量電話號碼的系統,這個系統的功能包括:node

  1. 一次導入10萬條Excel數據
  2. 對數據進行篩選去重寫入數據庫
  3. 可對複雜查詢條件篩選出數據
  4. 導出數據到Excel表格
  5. 根據條件修改數據的字段

目的是從海量的數據中分配給電銷團隊電話號碼,同時跟蹤使用過的電話,包括初次撥打,以及有意願成交等等,須要記錄數據用於考覈業績。 下面咱們就介紹一下如何一次性處理10萬條數據,寫入MySQL。sql

導入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) {
}

此處省略對數據的預處理。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字段必定要使用索引,不然效率將會大打折扣。有了索引之後,這樣的子查詢速度並不慢,最終整個過程的時間控制在能夠接受的範圍內。

相關文章
相關標籤/搜索