MySQL插入优化-性能对比

插入优化主要包括:

  1. 批量插入条数据,而不是单个记录逐条插入。
  2. 手动提交事务,避免自动提交事务带来的额外开销。
  3. 使用load命令从本地文件导入。

性能对比

创建数据库表

CREATE TABLE if not exists `tb_sku`  
(  `id`            int(20)        NOT NULL primary key AUTO_INCREMENT,  `sn`            varchar(64)    NOT NULL,  `name`          varchar(64)    NOT NULL,  `price`         decimal(10, 2) NOT NULL,  `stock`         int(11)        NOT NULL,  `create_time`   timestamp      NOT NULL DEFAULT CURRENT_TIMESTAMP,  `update_time`   timestamp      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  `category_name` varchar(64)    NOT NULL,  `brand_name`    varchar(64)    NOT NULL,  `status`        tinyint(4)     NOT NULL DEFAULT '1',  `description`   varchar(1024)           DEFAULT NULL  
);

1. 单条插入自动提交事务

创建存储过程构建数据

drop procedure if exists `insertSkuData`;  
DELIMITER //  
create procedure `insertSkuData`(in num int)  
begin  declare i int default 1;  declare sn varchar(64);  declare name varchar(64);  declare sql_stmt TEXT;  -- 临时表作为数组,目的是为了随机取值  CREATE TABLE if not exists `tmp_name`  (  id     int primary key auto_increment,  t_name varchar(64)  );  insert into tmp_name(t_name)  values ('华为Mate60'),  ('华为Mate70'),  ('华为Mate80'),  ('华为Mate90'),  ('华为Mate100'),  ('华为Mate110'),  ('华为Mate120'),  ('华为Mate130'),  ('华为Mate140'),  ('华为Mate150');  insert into tmp_name(t_name)  values ('小米Mate60'),  ('小米Mate70'),  ('小米Mate80'),  ('小米Mate90'),  ('小米Mate100'),  ('小米Mate110'),  ('小米Mate120'),  ('小米Mate130'),  ('小米Mate140'),  ('小米Mate150');  insert into tmp_name(t_name)  values ('oppoMate60'),  ('oppoMate70'),  ('oppoMate80'),  ('oppoMate90'),  ('oppoMate100'),  ('oppoMate110'),  ('oppoMate120');  while i <= num  do  SET sql_stmt = 'insert into tb_sku(sn, name, price, stock, category_name, brand_name, description) values';  SET sn = UPPER(REPLACE(UUID(), '-', ''));  SET name = (select t_name from tmp_name order by rand() limit 1);  SET sql_stmt = CONCAT(sql_stmt, '(\'', sn, '\',\'', name, '\',', 999.0, ',', 100, ',', '\'手机\'', ',\'',  SUBSTR(name, 1, 2), '\',', '\'由存储过程insertSkuData生成\'', ')');  -- 执行SQL语句  set @sql_stmt = sql_stmt;  prepare stmt from @sql_stmt;  execute stmt;  deallocate prepare stmt;  SET i = i + 1;  end while;    drop table if exists tmp_name;  
end//  DELIMITER ;  call insertSkuData(1000000);

执行结果耗时:2m52s
在这里插入图片描述

2. 单条插入手动提交事务

创建存储过程构建数据

drop procedure if exists `insertSkuData`;  
DELIMITER //  
create procedure `insertSkuData`(in num int)  
begin  declare i int default 1;  declare sn varchar(64);  declare name varchar(64);  declare sql_stmt TEXT;  -- 临时表作为数组,目的是为了随机取值  CREATE TABLE if not exists `tmp_name`  (  id     int primary key auto_increment,  t_name varchar(64)  );  insert into tmp_name(t_name)  values ('华为Mate60'),  ('华为Mate70'),  ('华为Mate80'),  ('华为Mate90'),  ('华为Mate100'),  ('华为Mate110'),  ('华为Mate120'),  ('华为Mate130'),  ('华为Mate140'),  ('华为Mate150');  insert into tmp_name(t_name)  values ('小米Mate60'),  ('小米Mate70'),  ('小米Mate80'),  ('小米Mate90'),  ('小米Mate100'),  ('小米Mate110'),  ('小米Mate120'),  ('小米Mate130'),  ('小米Mate140'),  ('小米Mate150');  insert into tmp_name(t_name)  values ('oppoMate60'),  ('oppoMate70'),  ('oppoMate80'),  ('oppoMate90'),  ('oppoMate100'),  ('oppoMate110'),  ('oppoMate120');  -- 手动提交事务,将所有数据作为一次事务提交  start transaction ;  while i <= num  do  SET sql_stmt = 'insert into tb_sku(sn, name, price, stock, category_name, brand_name, description) values';  SET sn = UPPER(REPLACE(UUID(), '-', ''));  SET name = (select t_name from tmp_name order by rand() limit 1);  SET sql_stmt = CONCAT(sql_stmt, '(\'', sn, '\',\'', name, '\',', 999.0, ',', 100, ',', '\'手机\'', ',\'',  SUBSTR(name, 1, 2), '\',', '\'由存储过程insertSkuData生成\'', ')');  -- 执行SQL语句  set @sql_stmt = sql_stmt;  prepare stmt from @sql_stmt;  execute stmt;  deallocate prepare stmt;  SET i = i + 1;  end while;    commit ;    drop table if exists tmp_name;  
end//  DELIMITER ;  call insertSkuData(1000000);

执行结果耗时:1m7s:
在这里插入图片描述

3. 批量插入自动提交事务

创建存储过程构建数据:

drop procedure if exists `insertSkuData`;  
DELIMITER //  
create procedure `insertSkuData`(in num int)  
begin  declare i int default 1;  declare j int default 1;  declare batch_size int default 10;  declare cnt int default 0;  declare sn varchar(64);  declare name varchar(64);  declare sql_stmt TEXT;  -- 计算批次,比如10000条记录,则分10批次,一个批次1000条记录插入数据  if MOD(num, batch_size) = 0 then  set cnt = num / batch_size;  else        set cnt = num / batch_size + 1;  end if;  -- 临时表作为数组,目的是为了随机取值  CREATE TABLE if not exists `tmp_name`  (  id     int primary key auto_increment,  t_name varchar(64)  );  insert into tmp_name(t_name)  values ('华为Mate60'),  ('华为Mate70'),  ('华为Mate80'),  ('华为Mate90'),  ('华为Mate100'),  ('华为Mate110'),  ('华为Mate120'),  ('华为Mate130'),  ('华为Mate140'),  ('华为Mate150');  insert into tmp_name(t_name)  values ('小米Mate60'),  ('小米Mate70'),  ('小米Mate80'),  ('小米Mate90'),  ('小米Mate100'),  ('小米Mate110'),  ('小米Mate120'),  ('小米Mate130'),  ('小米Mate140'),  ('小米Mate150');  insert into tmp_name(t_name)  values ('oppoMate60'),  ('oppoMate70'),  ('oppoMate80'),  ('oppoMate90'),  ('oppoMate100'),  ('oppoMate110'),  ('oppoMate120');  while i <= cnt  do  if i = cnt then  set batch_size = num - (cnt - 1) * batch_size;  end if;  SET sql_stmt = 'insert into tb_sku(sn, name, price, stock, category_name, brand_name, description) values';  SET j = 1;  while j <= batch_size  do  SET sn = UPPER(REPLACE(UUID(), '-', ''));  SET name = (select t_name from tmp_name order by rand() limit 1);  SET sql_stmt =  CONCAT(sql_stmt, '(\'', sn, '\',\'', name, '\',', 999.0, ',', 100, ',', '\'手机\'', ',\'',  SUBSTR(name, 1, 2), '\',', '\'由存储过程insertSkuData生成\'', ')');  IF j < batch_size THEN  SET sql_stmt = CONCAT(sql_stmt, ', ');  END IF;  SET j = j + 1;  end while;  -- 执行SQL语句  set @sql_stmt = sql_stmt;  prepare stmt from @sql_stmt;  execute stmt;  deallocate prepare stmt;  SET i = i + 1;  end while;drop table if exists tmp_name;  
end//  DELIMITER ;  
call insertSkuData(1000000);

执行结果耗时:1m5s:
在这里插入图片描述

4. 批量插入手动提交事务

创建存储过程构建数据:

drop procedure if exists `insertSkuData`;  
DELIMITER //  
create procedure `insertSkuData`(in num int)  
begin  declare i int default 1;  declare j int default 1;  declare batch_size int default 10;  declare cnt int default 0;  declare sn varchar(64);  declare name varchar(64);  declare sql_stmt TEXT;  -- 计算批次,比如10000条记录,则分10批次,一个批次1000条记录插入数据  if MOD(num, batch_size) = 0 then  set cnt = num / batch_size;  else        set cnt = num / batch_size + 1;  end if;  -- 临时表作为数组,目的是为了随机取值  CREATE TABLE if not exists `tmp_name`  (  id     int primary key auto_increment,  t_name varchar(64)  );  insert into tmp_name(t_name)  values ('华为Mate60'),  ('华为Mate70'),  ('华为Mate80'),  ('华为Mate90'),  ('华为Mate100'),  ('华为Mate110'),  ('华为Mate120'),  ('华为Mate130'),  ('华为Mate140'),  ('华为Mate150');  insert into tmp_name(t_name)  values ('小米Mate60'),  ('小米Mate70'),  ('小米Mate80'),  ('小米Mate90'),  ('小米Mate100'),  ('小米Mate110'),  ('小米Mate120'),  ('小米Mate130'),  ('小米Mate140'),  ('小米Mate150');  insert into tmp_name(t_name)  values ('oppoMate60'),  ('oppoMate70'),  ('oppoMate80'),  ('oppoMate90'),  ('oppoMate100'),  ('oppoMate110'),  ('oppoMate120');  -- 整个数据作为一次事务提交  start transaction ;  while i <= cnt  do  if i = cnt then  set batch_size = num - (cnt - 1) * batch_size;  end if;  SET sql_stmt = 'insert into tb_sku(sn, name, price, stock, category_name, brand_name, description) values';  SET j = 1;  while j <= batch_size  do  SET sn = UPPER(REPLACE(UUID(), '-', ''));  SET name = (select t_name from tmp_name order by rand() limit 1);  SET sql_stmt =  CONCAT(sql_stmt, '(\'', sn, '\',\'', name, '\',', 999.0, ',', 100, ',', '\'手机\'', ',\'',  SUBSTR(name, 1, 2), '\',', '\'由存储过程insertSkuData生成\'', ')');  IF j < batch_size THEN  SET sql_stmt = CONCAT(sql_stmt, ', ');  END IF;  SET j = j + 1;  end while;  -- 执行SQL语句  set @sql_stmt = sql_stmt;  prepare stmt from @sql_stmt;  execute stmt;  deallocate prepare stmt;  SET i = i + 1;  end while;    commit;    drop table if exists tmp_name;  
end//  DELIMITER ;  
call insertSkuData(1000000);

执行结果耗时:45s:
在这里插入图片描述

Note:批量插入的大小根据物理性能而定。

  1. 可以在插入数据前,禁用唯一性检查,结束后开启
-- 关闭唯一性检查
SET UNIQUE_CHECKS=0;-- 开启
SET UNIQUE_CHECKS=1;
  1. 可以在插入数据前,禁用外键检查,结束后开启
-- 关闭外键检查
SET FOREIGN_KEY_CHECKS=0;-- 开启
SET FOREIGN_KEY_CHECKS=1;

不过上面两种优化实测没有明显优化。

总结:

  1. 手动提交事务可以很大程度优化数据插入。
  2. 批量插入优化的批次大小视情况而定。

单条自动提交事务 < 单条手动提交事务 ≈ 批量插入自动提交事务 < 批量插入手动提交事务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/450060.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

facefusion,使用CPU实现一键图片、视频换脸,无需显卡,无限时长(附下载即用的整合包)

FaceFusion 是一种利用人工智能技术将两张或多张人脸融合在一起的图像处理技术。这种技术通过面部特征的识别和重构&#xff0c;将不同的人脸混合成一张新的脸&#xff0c;生成的图像看起来像是这些人脸的融合体。 FaceFusion使用深度学习算法&#xff0c;来捕捉人脸的细节和特…

OpenCV答题卡识别

文章目录 一、基本流程二、代码实现1.定义函数2.图像预处理&#xff08;1&#xff09;高斯模糊、边缘检测&#xff08;2&#xff09;轮廓检测&#xff08;3&#xff09;透视变换&#xff08;4&#xff09;阈值处理和轮廓检测 3.筛选和排序选项轮廓4.判断答案5.显示结果 三、总结…

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

目标检测作为计算机视觉领域的一项核心任务&#xff0c;极大地推动了整个领域的发展。它不仅是其他许多视觉任务的基础工具&#xff0c;还在学术研究和实际应用之间架起了一座桥梁。目标检测的主要任务是识别和定位图像或视频中的特定对象&#xff0c;通常需要模型能同时处理多…

C++ | Leetcode C++题解之第476题数字的补数

题目&#xff1a; 题解&#xff1a; class Solution { public:int findComplement(int num) {int highbit 0;for (int i 1; i < 30; i) {if (num > (1 << i)) {highbit i;}else {break;} }int mask (highbit 30 ? 0x7fffffff : (1 << (hig…

【DBA Part01】国产Linux上安装Oracle进行数据迁移

内容如下&#xff1a; 1.1.生产环境RHEL/OEL Linux8Oracle11gR2安装配置 1.2.国产麒麟操作系统Oracle11gR2安装配置 1.3.国产麒麟操作系统Oracle11gR2 RAC集群安装配置 1.4.Oracle11gR2迁移到国产麒麟操作系统&#xff08;单机/RAC&#xff09; 本阶段课程项目需求说明&am…

零一万物 Yi-Lightning:超越 GPT-4o 冲击全球榜单;阿里国际 Marco 翻译大模型发布丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 …

CEEMDAN +组合预测模型(Transformer - BiLSTM + ARIMA)

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现&#xff08;一&#xff09;EMD-CSDN博客 EMD、EEM…

具备技术二:正则表达式

一、C正则库 regex 用于报文的解析。 使用接口&#xff1a;bool regex_match(const string &src, smatch &matches, regex &e); src&#xff1a;要解释的字符串。 smatch&#xff1a;一个类似于数组的结构&#xff0c;用于存储一个个解释之后的字符串。 matche…

鸿蒙网络编程系列3-TCP客户端通讯示例

1. TCP简介 TCP协议是传输层最重要的协议&#xff0c;提供了可靠、有序的数据传输&#xff0c;是多个广泛使用的表示层协议的运行基础&#xff0c;相对于UDP来说&#xff0c;TCP需要经过三次握手后才能建立连接&#xff0c;建立连接后才能进行数据传输&#xff0c;所以效率差了…

Android -- [SelfView] 多动画效果图片播放器

Android – [SelfView] 多动画效果图片播放器 效果&#xff08;录制的有点卡&#xff09; 1. 引用&#xff1a; <com.nepalese.virgolib.widget.image.BaseImageViewandroid:id"id/base_image"android:layout_width"match_parent"android:layout_heigh…

AD画图的使用

一、新建工程 二、绘制原理图 1、原理图搜索方法&#xff1a; https://www.ti.com/lit/ds/symlink/tlv1117.pdf?ts1729143086540&ref_urlhttps%253A%252F%252Fwww.mouser.tw%252F www.alldatasheet.com 2、绘图步骤&#xff1a; 注&#xff1a;管脚四点朝外

2024软考网络工程师笔记 - 第5章.无线通信网

文章目录 移动通信与 5G1️⃣移动通信2️⃣移动通信制式3️⃣5G 应用场景与关键技术 &#x1f551;WLAN 通信技术1️⃣WLAN 通信技术 &#x1f552;WLAN 频谱与信道&#xff08;高频考点&#xff09;1️⃣WLAN 网络分类2️⃣ISM频段3️⃣不重叠信道&#xff08;重点&#xff09…

uniapp 省、市、区、乡镇 数据层级选择插件 Ba-DataPicker

Ba-DataPicker 是一款uniapp数据层级选择弹窗插件。支持省市区乡四级&#xff1b;支持自定义数据。 支持省、市、区、乡镇四级支持自定义数据支持字母检索 截图展示 支持定制、本地包、源码等&#xff0c;有建议和需要&#xff0c;请点击文章结尾“Uniapp插件开发”联系我&am…

人脸识别-特征算法

文章目录 一、LBPH算法1.基本原理2.实现步骤3.代码实现 二、Eigenfaces算法1.特点2.代码实习 三、FisherFaces算法1.算法原理2.算法特点3.代码实现 四、总结 人脸识别特征识别器是数字信息发展中的一种生物特征识别技术&#xff0c;其核心在于通过特定的算法和技术手段&#xf…

代码随想录算法训练营第八天(1)|哈希表理论基础

文档讲解&#xff1a;代码随想录 难度&#xff1a;有一点 哈希表理论基础 哈希表 首先什么是哈希表&#xff0c;哈希表&#xff08;英文名字为Hash table&#xff0c;国内也有一些算法书籍翻译为散列表&#xff0c;大家看到这两个名称知道都是指hash table就可以了&#xff0…

指尖的无声告白,算法里的隐约温柔

公主请阅 1. 三数之和1. 题目说明示例 1示例 2示例 3 1.2 题目分析1.3 代码部分1.3 代码分析 2. 四数之和2.1 题目说明示例 1示例 2 2.2 题目分析2.3 代码部分2.4 代码解析 1. 三数之和 题目传送门 1. 题目说明 给定一个整数数组 nums&#xff0c;判断数组中是否存在三个元素 …

鸿道Intewell操作系统构型介绍之Intewell-C全实时构型

鸿道(Intewell)操作系统主要包括Intewell-C、Intewell-H和Intewell-V三种不同构型产品&#xff1a; Intewell-C Intewell-C是一款工业实时微内核操作系统&#xff0c;由科东软件自主研发&#xff0c;具有超低延迟和最小抖动&#xff0c;保障工业设备可以高效处理时间敏感的现…

python爬虫实战案例——从移动端接口抓取微博评论,采用cookie登陆,数据存入excel表格,超详细(15)

文章目录 1、任务目标2、网页分析3、代码编写3.1 代码分析3.2 完整代码1、任务目标 1、目标网站:微博文章(https://m.weibo.cn/detail/4813628149072458),这是微博某一篇博文,用于本文测试 2、要求:爬取该博文下,所有一级评论和二级评论,以及每条评论的作者,最后保存至E…

熵权法计算评价指标权重——使用Excel VBA实现

[ 熵权法 ] 信息是系统有序程度的一个度量&#xff0c;熵是系统无序程度的一个度量&#xff1b;根据信息熵的定义&#xff0c;对于某项指标&#xff0c;可以用熵值来判断某个指标的离散程度&#xff0c;其信息熵值越小&#xff0c;指标的离散程度越大&#xff0c; 该指标对综合…

java脚手架系列4--测试用例、拦截器

异常处理、拦截器、数据库连接 1 测试用例 单元测试是一个老生常谈的问题&#xff0c;无论是后端对自己的代码质量把的第一道关也好&#xff0c;也是对测试减缓压力。这里就不过多讲述测试用例的重要性&#xff0c;但是有2个框架我们必须了解一下。 1.1 JUnit和mockito 我们…