背景
最近在做數(shù)倉(cāng)重構(gòu)項(xiàng)目,遇到一些性能瓶頸,這里記錄一下解決辦法。
隨著業(yè)務(wù)數(shù)據(jù)每天都在增加,幾年前開發(fā)的etl任務(wù)開始跑不動(dòng)了。大表一般是通過增量的方式插入,但是修復(fù)bug 或者每月/季度跑一次的情況 需要跑全量,原來的etl任務(wù)可能需要跑幾個(gè)小時(shí),甚至出現(xiàn)超時(shí)失敗的情況。因此需要優(yōu)化,下面介紹一些優(yōu)化方法。(項(xiàng)目是用kettle做的,如果使用其他開發(fā)工具,也可以參考下面的思路)
1、配置數(shù)據(jù)庫(kù)連接參數(shù)
2、去掉臨時(shí)表 DDL的primary key
3、調(diào)整輸出組件的數(shù)量
4、暫時(shí)關(guān)閉索引
優(yōu)化方法
1、配置數(shù)據(jù)庫(kù)連接參數(shù)
defaultFetchSize:5000
useCursorFetch : true 相當(dāng)于告訴數(shù)據(jù)庫(kù),分批讀取數(shù)據(jù),每次打包5000條回來
rewriteBatchedStatements : true 插入數(shù)據(jù)的時(shí)候,批量插入
useServerPrepStmts : true 啟動(dòng)預(yù)編譯
useCompression : true 客戶端跟服務(wù)器之間的數(shù)據(jù)壓縮傳輸
以kettle為例,配置方法如下:
測(cè)試結(jié)果:
配置參數(shù)前:
配置參數(shù)后:
性能提升了80倍!
2、去掉DDL中的 primary key
在 etl 的過程中會(huì)用中間表來存放一些臨時(shí)數(shù)據(jù),這些中間表可以去掉 ddl中的 primary key,通過邏輯來保證唯一性,只在結(jié)果表中使用primary key。primary key會(huì)檢查相關(guān)字段是否重復(fù),從而降低插入速度。(下面的案例 讀寫字段多,且表輸入sql很復(fù)雜,所以插入很慢)
測(cè)試結(jié)果如下:
去掉目標(biāo)表primary key 后
性能提升了20倍!
3、調(diào)整 輸出組件數(shù)量
如果輸出組件還是慢,可以復(fù)制多個(gè)輸出。具體操作:輸出組件 右鍵-改變開始復(fù)制的數(shù)量文章來源:http://www.zghlxwxcb.cn/news/detail-799256.html
4、暫時(shí)關(guān)閉索引
維護(hù)索引數(shù)據(jù)需要大量額外的開銷,因此全量數(shù)據(jù)插入前,可以先關(guān)掉索引,插入完畢再打開索引。
ALTER TABLE table_name DISABLE KEYS;
ALTER TABLE table_name ENABLE KEYS;
效果對(duì)比如下:
性能提高了4倍!文章來源地址http://www.zghlxwxcb.cn/news/detail-799256.html
到了這里,關(guān)于mysql 批量數(shù)據(jù)插入很慢(kettle 輸入輸出組件) 性能優(yōu)化辦法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!