kettle大數據量讀寫mysql性能優化

 修改kettleDB鏈接設置html

 

1. 增長批量寫的速度:
useServerPrepStmts=false  
rewriteBatchedStatements=true  
useCompression=true
2. 增長讀的速度:
useServerPrepStmts=true
cachePrepStmts=truemysql

參數說明:sql

1)useCompression=true,壓縮數據傳輸,優化客戶端和MySQL服務器之間的通訊性能。數據庫

2)rewriteBatchedStatements=true  ,開啓批量寫功能服務器

將會使大批量單條插入語句:性能

INSERT INTO t (c1,c2) VALUES ('One',1);
INSERT INTO t (c1,c2) VALUES ('Two',2);
INSERT INTO t (c1,c2) VALUES ('Three',3);優化

改寫成真正的批量插入語句:spa

INSERT INTO t (c1,c2) VALUES ('One',1),('Two',2),('Three',3);.net

3)useServerPrepStmts=false  關閉服務器端編譯,sql語句在客戶端編譯好再發送給服務器端,發送語句如上。設計

若是爲true,sql會採用佔位符方式發送到服務器端,在服務器端再組裝sql語句。

佔位符方式:INSERT INTO t (c1,c2) VALUES (?,?),(?,?),(?,?);

此方式就會產生一個問題,當列數*提交記錄數>65535

 

時就會報錯:Prepared statement contains too many placeholders,

這是因爲我把「提交記錄數量」設爲10000,而要插入記錄的表字段有30個,因此要進行批量插入時須要30*10000=300000  > 65535 ,故而報錯。

解決方案:

方案1:把DB鏈接中的 rewriteBatchedStatements 給設置爲false(或者去掉),不過這個操做會影響數據的插入速度。

方案2:更改表輸出的設計。確保30個輸出字段的和提交記錄數量的乘積不超過65535。好比把提交記錄數量由10000更改成450(30*2000=60000< 65535)

固然咱們的目的是爲了提升數據庫寫速度,因此當rewriteBatchedStatements =true時useServerPrepStmts=false必須配合使用。

 mysql參數調優能夠參考以下文檔

https://dev.mysql.com/doc/connectors/en/connector-j-reference-configuration-properties.html


數據丟失問題

性能提高後,遇到另外個問題,86萬數據丟失了130多條,kettle無報錯,各類mysql參數設置以後都無效果,耗時近一天,最終查到是重複數據致使。

估計是由於重複數據在mysql寫不進去致使該批次數據寫失敗,可是kettle無報錯這個就比較坑。

解決辦法就是:1)取消數據表主鍵或者惟一索引 ,固然這是治標不治本的作法。2)根本的作法就是排查重複數據,從源頭杜絕重複數據

 

 

 

參考文檔:

https://blog.csdn.net/smooth00/article/details/69389424?utm_source=itdadao&utm_medium=referral

http://www.jackieathome.net/archives/169.html

相關文章
相關標籤/搜索