百萬量級數據_文件處理性能提升

 

現狀資料說明:

 

 

需求背景介紹:

1. 該文件功能是以 .csv 後綴的文件進行解析後,反查我方數據庫表,取出賬單後做具體的處理業務

2. 該文件功能主要分爲以下幾個環節

  1. 獲取URL並下載文件
  2. 文件解析並檢查文件數據的有效性及數據去重
  3. 取出文件中的具體業務字段進行查詢我方的庫表
  4. 根據查詢出來的賬單做具體的業務處理

3. 處理百萬量級以上數據時,整體效率偏低,理想情況的是處理百萬量級的數據控制在一個小時左右

 

注:該文件處理功能是在單線程的情況下執行,暫時不需要考慮太消耗性能來開多線程的處理方案

 

流程耗時分析:

 文件去重後以資產號查詢我方賬單集合,整體是從 7ms ~ 22ms 不等;理論上來說文件數據有多少條就會查詢多少次庫表

結論:通過覈實代碼邏輯,該功能文件的執行文件耗時,均爲在查詢DB這塊佔用耗時較多

如:對到170W+的數據量,需要耗時2個半小時左右執行完。現文件執行流程耗時也算相應合理。也存在要提高文件處理性能的必要性

 

問題點:

 

現SQL的查詢邏輯等同於

 

select * from postloan_#xx#_db.t_asset_bill_#y# where Fstatus=1 and Fasset_id=xxxx 

 

1. 這裏是返回的整個賬單集合;如 asset_id 對應的數據有12條賬單數據,則返回了12條記錄的一個list對象

2. 重新評估業務後,這樣的SQL查詢是可以進一步優化

3. 全量字段查詢是沒有必要的,影響磁盤IO的處理效率

 

注:該庫表爲百庫十庫,庫表字段數量超過一百個字段

 

 

設計方案:

 

優化思路:


1. 從查詢整個賬單集合返回    -->  查詢最大期賬單返回
2. 全字段賬單數據返回   -->    精簡需要字段的返回

 

 

業務邏輯優化:

 

1. 獲取文件中資產號,通過資產號入參。返回提前結清的賬單的最大期數賬單對象
2. 提供該 getSimpleLastTermBillByAssetId 查詢方法,mapper 文件的查詢SQL同步調整字段精簡返回

-- 根據資產號查詢提前結清最大期數的賬單(字段精簡版本)

select 

Fid,Floan_channel_id,Fasset_id,Fbill_id,Fcus_order_id,Finsure_mode_no,Frepay_term,Freal_repay_data,Freal_repay_type

from

postloan_#xx#_db.t_asset_bill_#y#

where

Fstatus=1 and Fasset_id=xxxx and Floan_term=Frepay_term and freal_repay_type = 30 and Fpostloan_repay_source_type in (0,20)

3. 獲取到我方提前結清的賬單對象後(已做字段精簡),對符合退保的賬單進行組裝MQ發出 (現有的處理邏輯中退保校驗條件減少)

 

注:這裏是將代碼邏輯中的一部分校驗條件前置到SQL查詢中實現,減少業務代碼邏輯

 

效率提升效果:

 

扣款回盤文件退保性能提升需求(線上觀察)
a.整體文件處理性能提升 100~110%
b.賬單查詢優化後由 7~22ms 下降到 2~6ms

 

 

優化總結:

1. 通常情況下程序中文件處理效率低,都是在解析文件的過程中有查詢DB的情況;若只是解析文件做業務處理話,百萬量級的數據也就只是幾秒鐘程序就能跑完

2. 數據庫表查詢,若非必要,應當根據業務使用場景;第一優先選擇爲需要字段SQL查詢來提高查詢效率,減少磁盤IO與內存的消耗

 

 

參考資料:

MySQL:查詢字段數量多少對查詢效率的影響  http://blog.itpub.net/7728585/viewspace-2668552/

 

 

 

 

 

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