批量Insert性能測試

一、運行環(huán)境

image.png
image.png

Mysql版本:mysql-8.0.21-winx64

數據庫連接池:druid

二、批量 Insert 業(yè)務背景

大批量數據同步、加工。
同步效率較低時,會存在數據更新延遲、CPU、IO資源長時間被占用等問題。

如:從合同管理系統(tǒng)中同步合同數據存庫,并在本系統(tǒng)計算合同統(tǒng)計信息,如:合同超期數量等。

三、測試準備

建表語句:

CREATE TABLE tab_user
(
id bigint(32) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
name varchar(64) DEFAULT NULL COMMENT '姓名',
sex varchar(32) DEFAULT NULL COMMENT '性別',
age int(11) DEFAULT NULL COMMENT '年齡',
create_time datetime DEFAULT NULL COMMENT '創(chuàng)建時間',
update_time datetime DEFAULT NULL COMMENT '更新時間',
status tinyint(1) DEFAULT NULL COMMENT '是否刪除 1刪除 0未刪除',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

策略

1、 批量寫
2、 多線程寫

數據量:10w、100w、1000w、1m
每次批量寫的數據條數:10、100、1000、2000、5000

線程池配置
spring.task.scheduling.thread-name-prefix=SysAsyncExecutor_
spring.task.scheduling.pool.size=10

spring.task.execution.thread-name-prefix=SysAsyncExecutor_
spring.task.execution.pool.core-size=6
spring.task.execution.pool.max-size=200
spring.task.execution.pool.queue-capacity=10
spring.task.execution.pool.keep-alive=60
spring.task.execution.pool.allow-core-thread-timeout=true

四、測試結果

批量插入數據對效率的影響

批量10 批量100 批量1000 批量2000 批量5000
10w 27966 6134 3268 3137 3031

說明: 插入10w條數據,每條sql語句分別批量insert數據10條、100條、1000條、2000條、5000條。

觀察結論:
1、 批量寫數據比逐條寫數據耗時更短。
2、 隨著每次批量寫入的數據增多,總耗時變短,但有效率瓶頸。每次批量寫1000條數據,效率較高,再增加pageSize不能顯著縮短耗時。

image.png

多線程寫對效率的影響

(單位:毫秒) 批量1000 批量1000, 多線程
10w 3294 1160
100w 31685 15556
1000w 333115 91439
1m 6737160 899613

說明: 插入10w、100w、1000w、1m數據,比較單線程批量插入和多線程批量插入的耗時。

觀察結論: 在數據庫連接資源充足的情況下,使用線程池進行多線程操作可以提升操作效率。

image.png

單線程和多線程CPU和IO耗費對比

說明:
a) 單表新增1m數據,批量1000條單線程操作。時間:17:46:50.783——19:39:07.944
b) 單表新增1m數據,批量1000條多線程操作。 時間:19:48:05.053——20:03:04.666

監(jiān)控兩個時間段windows系統(tǒng)的CPU和IO消耗。(監(jiān)控工具:windows自帶perfrom工具)

踩坑記錄: 在并發(fā)新增1m數據后,執(zhí)行 delete from tab_user;時,報錯并出現數據庫假死現象(無法進行對該表的任何操作,如select、drop table)

image.png

觀察結論:大數據量和高并發(fā)對機器的CPU和IO有較大壓力,并且會對數據庫操作性能有影響。

CPU:


image.png

DISK:


image.png

帶索引和不帶索引insert效率對比

(單位:毫秒) 批量1000,表不帶索引 批量1000,表帶索引
10w 3294 15528
100w 31685 178754
1000w 333115 402082

說明: 批量insert數據,每條sql插入1000條數據,比較數據庫帶索引和不帶索引時的數據新增耗時。

觀察結論: 添加索引后,新增數據會增加耗時。另外,在執(zhí)行 delete from tab_user 刪除數據時,耗時顯著增加。

分庫分表情形下大數據量insert

使用shardingJdbc框架實現分庫分表,新增1000w條數據,耗時1164088。分庫分表額外的改寫SQL和路由操作增加了耗時。

查詢效率

按姓名查詢某人的信息
select * from tab_user where name ='覃志強'

1000w
普通表非索引 3.44s
普通表帶索引 0.6s
分庫分表帶索引 0.5s

如果可以通過加索引、SQL優(yōu)化的方式提高查詢效率,則先不考慮分庫分表。

查詢性能相差不大的原因分析:
1、 數據量不夠大
2、 并發(fā)操作壓力較小
3、 查詢語句簡單
4、 分庫分表均在本機操作,沒有多臺機器集群。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • ?摘自:https://help.aliyun.com/document_detail/29338.html?sp...
    許你一枝花閱讀 4,883評論 0 8
  • 性能指標分類 在進行性能測試的指標監(jiān)控和結果分析時,可以關注以下這幾個維度的指標: 系統(tǒng)性能指標 資源性能指標 數...
    豬兒打滾閱讀 2,886評論 0 6
  • 交易響應時間# 1. 定義及解釋 ? 響應時間指用戶從客戶端發(fā)起一個請求開始,到客戶端接收到從服務器端返回的響應結...
    Java工程師擱淺閱讀 764評論 0 0
  • 性能測試相關概念 并發(fā)用戶數(VU):系統(tǒng)同時處理的request/事務數 QPS(TPS)(transactio...
    johnny_zhao閱讀 665評論 0 0
  • 表情是什么,我認為表情就是表現出來的情緒。表情可以傳達很多信息。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,434評論 2 7

友情鏈接更多精彩內容