当前位置: 首页 > news >正文

Mysql使用中的性能优化——批量插入的规模对比

在《Mysql使用中的性能优化——单次插入和批量插入的性能差异》中,我们观察到单次批量插入的数量和耗时呈指数型关系。
在这里插入图片描述
这个说明,不是单次批量插入的数量越多越好。本文我们将通过实验测试出本测试案例中最佳的单次批量插入数量。

结论

本案例中约每次插入2000~5000条数据时耗时最少。

实验数据

在这里插入图片描述

可以看到“单次批量中数量”和耗时呈U型曲线关系
如果单次批量中数量过少,效率会接近于单次插入,效率会收到很大影响。
如果单次批量中数量过多,效率也会快速增加。

测试环境

见《Mysql使用中的性能优化——搭建Mysql的监测服务》

测试脚本

DROP DATABASE IF EXISTS testdb;
CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;DROP TABLE IF EXISTS test_insert;
CREATE TABLE test_insert (id SERIAL PRIMARY KEY,name TEXT
) engine=InnoDB;DROP PROCEDURE IF EXISTS test_insert_proc_batch_bulk;
DELIMITER //
CREATE PROCEDURE test_insert_proc_batch_bulk(IN name TEXT, IN fromNum INT, IN toNum INT)
BEGINDECLARE i INT DEFAULT fromNum;DECLARE new_names TEXT DEFAULT '';SET @sql = 'INSERT INTO test_insert (name) VALUES ';WHILE i < toNum DOSET new_names = CONCAT(name, i);SET i = i + 1;SET @sql = CONCAT(@sql, '("', new_names, '"),');END WHILE;SET @sql = LEFT(@sql, LENGTH(@sql) - 1);PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;COMMIT;
END //
DELIMITER ;DROP PROCEDURE IF EXISTS test_insert_proc_batch;
DELIMITER //
CREATE PROCEDURE test_insert_proc_batch(IN name TEXT, IN count INT, IN step INT)
BEGINDECLARE i INT DEFAULT 0;DECLARE new_name TEXT DEFAULT '';WHILE i < count DOSET new_name = CONCAT(name, i);CALL test_insert_proc_batch_bulk(new_name, i, i + step);SET i = i + step;END WHILE;COMMIT;
END //
DELIMITER ;TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 50);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 100);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 150);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 200);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 250);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 300);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 350);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 400);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 450);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 500);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 1000);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 1500);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 2000);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 2500);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 5000);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 7500);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 10000);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 12500);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 15000);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 17500);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 20000);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 22500);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 25000);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 27500);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 30000);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 32500);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 35000);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 37500);
TRUNCATE TABLE test_insert;
CALL test_insert_proc_batch('test', 100000, 40000);

测试结果原始数据

在这里插入图片描述

http://www.lryc.cn/news/367401.html

相关文章:

  • TCP为什么握手是三次,而挥手是四次
  • 前端面试题大合集9----TypeScript
  • Linux:动态库和静态库的编译与使用
  • 【Pyqt6 学习笔记】DIY一个二维码解析生成小工具
  • 关于xilinx srio ip复位问题
  • 04 uboot 编译与调试
  • 【机器学习】机器学习与医疗健康在智能诊疗中的融合应用与性能优化新探索
  • 在线OJ项目测试(selenium+Junit5)
  • 计算机系统基础笔记(12)——控制
  • 使用RedissonClient的管道模式批量查询key
  • UR机器人通信汇总
  • AI学习指南机器学习篇-使用ID3算法构建决策树
  • React实战(一)初始化项目、配置router、redux、axios
  • 高质量 HarmonyOS 权限管控流程
  • java里面封装https请求工具类2
  • 前端面试题日常练-day59 【面试题】
  • 计算机小问题(4)--关闭联想电脑的小组件
  • mac无法读取windows分区怎么办 苹果硬盘怎么读取
  • 【设计模式】JAVA Design Patterns——State(状态模式)
  • Docker搭建可道云
  • 【RISC-V】站在巨人的肩膀上——看开源芯片、软件生态、与先进计算/人工智能/安全的结合
  • test 判断字符串不为空
  • Python数据分析I
  • Qt5/6使用SqlServer用户连接操作SqlServer数据库
  • [经验] 场效应管是如何发挥作用的 #知识分享#学习方法#职场发展
  • 数据挖掘--分类
  • 数据结构篇其六-串
  • 队列和栈的实现
  • lua vm 五: upvalue
  • React Native中集成ArcGIS以显示地图、渲染自定义图层和获取地理信息数据