Mysql批量插入更新效能優化

2021-07-25 18:19:30 字數 1801 閱讀 8292

對於資料量較大的插入和更新,因io/cpu等效能瓶頸,會產生大量的時間消耗,目前主流的優化主要包括預編譯、單條sql插入多條資料、事務插入等,下面詳細介紹一下:

單條插入(mybatis)

insert

into

sys_city (city_code, city_name, province_name, alias, abbre_py) values

($, $, $, $, $)

單條預編譯插入(mybatis)採用預編譯可以節約mysql服務的解析時間,mytatis中就是採用#變數

insert into sys_city (city_code, city_name, province_name, alias, abbre_py) values

(#, #, #, #, #)

單條sql插入多條資料即是拼接sql,在乙個sql中插入多條或更新多條資料。

insert

into sys_city (city_code, city_name, province_name, alias, abbre_py) values

("citycode1", "cityname1", "provincename1"

"alias1", "abbrepy1"),("citycode2", "cityname2", "provincename2"

"alias2", "abbrepy2")

快的原因

合併後日誌量(mysql的binlog和innodb的事務讓日誌)減少了,降低日誌刷盤的資料量和頻率,從而提高效率;

通過合併sql語句,減少網路傳輸的io;

通過合併sql語句,減少sql語句解析的次數;

注意事項

資料庫sql長度是有限制,sql長度別溢位,會報錯;

亂序插入時候速度超過innodb_buffer的容量,每次定位索引涉及較多的磁碟讀寫操作,效能下降較快;

事務插入事務插入即在插入前開啟事務,插入結束關閉事務進行提交即可。

快的原因

進行乙個insert操作時,mysql內部會建立乙個事務,在事務內才進行真正插入處理操作。通過使用事務可以減少建立事務的消耗;

注意事項

事務不能過大,mysql有innodb_log_buffer_size配置項,事務超出這個時,會刷磁碟,導致效能下降;

亂序插入時候速度超過innodb_buffer的容量,每次定位索引涉及較多的磁碟讀寫操作,效能下降較快;

測試結果

環境:i5-4200u 1.6ghz,12g記憶體,固態硬碟

\:單條插入:

:單條預編譯:

:單條插入多條:

:事務插入:

10004600毫秒

3334毫秒

8毫秒704毫秒

1000027204毫秒

26249毫秒

2959毫秒

2959毫秒

100000240954毫秒

254716毫秒

17286毫秒

20539毫秒

總結

採用合併sql+事務插入組合,效率最高,亂序插入時候速度超過innodb_buffer的容量,每次定位索引涉及較多的磁碟讀寫操作,效能下降較快;盡量採用非亂序方式即可

mysql批量更新資料 效能優化

最近做的遊戲,上線後出了不少問題,所以我就經常去查資料庫資料,翻各種日誌等,但是在查詢的時候發現好蛋疼,有些地方的時間是寫 2016 08 11 20 13 02 這種格式,有些地方的時間是寫 1470917582000 這種格式,然後多張表資料進行對比的時候就很蛋疼,我得不停進行時間轉換,噁心得不...

MySQL批量SQL插入效能優化詳解

對於一些資料量較大的系統,資料庫面臨的問題除了查詢效率低下,還有就是資料入庫時間長。特別像報表系統,每天花費在資料匯入上的時間可能會長達幾個小時或十幾個小時之久。因此,優化資料庫插入效能是很有意義的。經過對mysql innodb的一些效能測試,發現一些可以提高insert效率的方法,供大家參考參考...

Mysql批量插入更新

批量插入,使用mybatis批量語法 insert id insertbatch parametertype list insert into tbl1 a,b,c values foreach collection list item obj separator foreach insert 使用...