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

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

  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字段一定要使用索引,否則效率將會大打折扣。有了索引以後,這樣的子查詢速度並不慢,最終整個過程的時間控制在可以接受的範圍內。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章