上次面試問我上萬級別的資料如何快速插入資料庫,當時不知怎麼回答,回來通過查資料和實踐,通過執行緒池和事務管理實現了批量快速插入資料,特地總結一下。
目錄結構,乙個簡單的springboot工程
首先建立乙個普通的表只有三個字段:
create database if not exists demo;
use demo;
create table if not exists t_user
(t_id int not null,
t_name varchar(10
) not null,
t_age int not null
)
執行緒池配置
執行緒數量:
cpu密集型(加密,計算hash等):cpu核心數1到2倍左右
耗時io型(讀寫資料庫,檔案網路讀寫)一般是cpu核心數多倍充分利用cpu
這裡主要是io型
所以核心執行緒數配置為8,最大執行緒數配置為14
配置類,將執行緒池交給springboot框架去維護
記得執行緒池中佇列數量,這裡要迴圈1000次數,索性佇列設定成2000,避免佇列過小執行緒池奔潰
服務層**,處理資料插入操作
@service
//開啟事務
@transactional
public
class
demoservice
//執行緒池任務結束立即關閉執行緒池
texecutor.
shutdown()
; system.out.
println
(texecutor.
getmaximumpoolsize()
);// 結束時間
long end =
newdate()
.gettime()
;// 耗時
system.out.
println
("1000萬條資料插入花費時間 : "
+(end - begin)
/1000);
system.out.
println
(end)
; system.out.
println
(begin);}
private
class
demorunnable
implements
runnable
//提交事務
1000萬條資料插入執行時間幾乎為0
注意點:
資料庫表的預設容量是:4m,如果插入資料量過大,超過的容量的資料會插入失敗
檢視容量show variables like 『%max_allowed_pack%』;
設定容量set global max_allowed_packet = 100乘1024乘1024並重啟;
插入後會很快顯示成功並顯示結果,但是後台資料庫會默默執行插入實際時間會比較長,所以不要急著去檢視資料庫。
PHP 千萬級別資料插入
header content type text html charset utf 8 設定 執行不受時間限制 set time limit 0 鏈結資料庫 con mysqli connect 127.0.0.1 root test if mysqli connect error 設定編碼為utf...
Mysql千萬級別資料優化方案
一 目的與意義 1 說明 在mysql單錶中資料達到千萬級別時資料的分頁查詢結果時間過長,對此進行優達到最優效果,也就是時間最短 此統計利用的jdbc連線,其中fid為該錶的主鍵 二 解決思路與根據 本測試表中資料在千萬級別 1 建立索引 優點 當表中有大量記錄時,若要對錶進行查詢,第一種搜尋資訊方...
Mysql千萬級別資料優化方案 單錶
mysql千萬級別資料優化方案 目錄 目錄 1 一 目的與意義 2 1 說明 2 二 解決思路與根據 本測試表中資料在千萬級別 2 1 建立索引 2 2 資料體現 主鍵非索引,實際測試結果 其中fid 建立索引 2 3 mysql 分頁原理 2 4 經過實際測試當對表所有列查詢時 2 三 總結 3 ...