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.xdnf.cn/news/1559986.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

防汛可视化系统:提升应急响应能力

通过图扑可视化系统实时监测水情、雨情和地理数据&#xff0c;辅助防汛决策与调度&#xff0c;提供直观的风险预警信息&#xff0c;从而优化资源分配&#xff0c;提高防汛应急响应效率。

​​​​​​​如何使用LTX Studio生成故事插画

在这个科技飞速发展的时代&#xff0c;人工智能已经成为创意领域的重要工具。LTX Studio 是一个强大的平台&#xff0c;可以帮助你将文字故事生成精美的插画。以下是详细的步骤&#xff0c;教你如何使用LTX Studio 生成故事插画。 生成prompt、&#xff1a; 使用copilot实现&…

SD2.0 Specification之SD卡寄存器(Card Register)

文章目录 CID(Card IDentification)RCA(Relative Card Address)DSR(Driver Stage Register)CSD(Card-Specific Data)SCR(SD CARD Configuration Register)OCR(Operation Conditions Register)SSR(SD Status Register)CSR(Card Status Register) 本文章主要讲解SD2.0的各个卡寄存…

望繁信科技成功签约国显科技 流程挖掘助力制造业智造未来

近日&#xff0c;上海望繁信科技有限公司&#xff08;简称“望繁信科技”&#xff09;成功与深圳市国显科技有限公司&#xff08;简称“国显科技”&#xff09;达成合作。国显科技作为全球领先的TFT-LCD液晶显示及Mini/Micro LED显示产品供应商&#xff0c;致力于为笔记本、手机…

Linux云计算 |【第四阶段】RDBMS2-DAY4

主要内容&#xff1a; MHA概述、部署MHA集群 一、MHA概述 1、MHA简介 MHA&#xff08;Master High Availability&#xff09;是一款开源的MySQL的高可用程序&#xff0c;由日本DeNA公司youshimaton开发&#xff0c;是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的…

Jenkins pipeline语法笔记

Jenkins pipeline 简介Jenkins Pipeline 优势DSL 是什么 pipeline支持两种语法&#xff1a;声明式pipeline语法&#xff1a;Pipelineagent Pipeline 声明式语法DeclarativeenvironmentoptionsparameterstriggerstoolsinputwhenParallel Pipeline Scripted语法流程控制Declarati…

罗永浩力荐格行随身WiFi,背后原因竟是...你绝对想不到!

一、罗永浩的“严选”哲学 虽然罗永浩做的是直播带货&#xff0c;但是他的形象与其他头部主播之间有着明显的不同。那些头部主播&#xff0c;都可以统称为“电商主播”&#xff0c;他们与那些淘宝店、京东店里直播的商家本质是一样的&#xff0c;只有流量和名气大小不同罢了。…

SpringBoot开发部署(热部署+常规部署+Docker部署)

开发热部署 SpringBoot模板引擎的页面默认是开启缓存的&#xff0c;如果修改了页面&#xff0c;则刷新页面是得不到修改后的页面的 在application.properties中关闭模板引擎缓存 Thymeleaf spring.thymeleaf.cachefalseFreeMarker spring.freemarker.cachefalseGroovy spring…

拓扑排序与入度为0的结点算法解析及实现

拓扑排序与入度为0的结点算法解析及实现 算法思想时间复杂度分析伪代码C语言实现环路检测结论拓扑排序是一种用于有向无环图(DAG, Directed Acyclic Graph)的重要操作,它可以对图中的结点进行排序,使得对于每一条有向边 (u, v),顶点 u 在排序中都出现在顶点 v 之前。本文介…

PVC刻字膜高精度模切应用

PVC刻字膜是一种由聚氯乙烯&#xff08;PVC&#xff09;为主要成分制成的薄膜材料&#xff0c;具有耐磨、耐刮、耐水、耐油以及良好的化学稳定性等特点。这种薄膜在多个行业中得到广泛应用&#xff0c;特别是在服装、鞋业、箱包、汽车内饰等领域&#xff0c;用于制作各种标识、…

C语言 | 第十四章 | 指针运算 指针数组 多重指针

P 131 断点调试应用案例&#xff08;2&#xff09;2023/2/3 一、应用案例 案例一&#xff1a;用调试查看数组越界异常。 #include<stdio.h> void main(){int arr[] {1,2,3,4,5};int i 0;int len sizeof(arr) / sizeof(int);for(i 0; i < len; i) { // 这里不…

代码随想录训练营Day29 | 93.复原IP地址 | 78.子集 | 90.子集II

学习文档&#xff1a;代码随想录 (programmercarl.com) 学习视频&#xff1a;代码随想录算法公开课 | 最强算法公开课 | 代码随想录 (programmercarl.com) Leetcode 93. 复原 IP 地址 题目描述 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&…

6. PH47 代码框架硬件开发环境搭建

概述 PH47代码框架的硬件开发环境搭建同样简单&#xff0c; 建立基本的 PH47 框架学习或二次开发的硬件开发环境所需设备如下&#xff1a; BBP 飞控板及相关软硬件: BBP飞控板&#xff0c;或者至少一块Stm32F411核心板&#xff08;WeAct Studio&#xff09;Stm32程序烧录工具…

【Vue3 + TS + Vite】从0到1搭建项目框架

前言 没搭建过Vue3的项目&#xff0c;从0开始搭建一下&#xff0c;记录一下自己的步骤。 技术栈&#xff1a; vue3 ts scss pinia vite 我尽量写的详细一些&#xff0c;后续也会记录我在项目过程中&#xff0c;遇到的一些问题。 文章目录 前言环境搭建一、创建项目1. 使用…

Java->排序

目录 一、排序 1.概念 2.常见的排序算法 二、常见排序算法的实现 1.插入排序 1.1直接插入排序 1.2希尔排序(缩小增量法) 1.3直接插入排序和希尔排序的耗时比较 2.选择排序 2.1直接选择排序 2.2堆排序 2.3直接选择排序与堆排序的耗时比较 3.交换排序 3.1冒泡排序…

【WEB应用安全测试指南–蓝队安全测试2】--超详细-可直接进行实战!!!亲测-可进行安全及渗透测试

安全基础理论入门知识参考上一篇《WEB应用安全测试指南蓝队安全测试1》 WEB应用安全测试指南2 一、文件 I/O 类1.1、任意文件上传1.2、任意文件下载1.3、文件包含 二、接口安全类2.1、短信炸弹2.2、邮件炸弹2.3、短信内容可控2.4、邮件内容可控 三、逻辑流程类3.1、越权3.2、未…

变阻器的未来发展趋势和前景如何?是否有替代品出现?

变阻器是一种用于调节电路中电阻值的电子元件&#xff0c;广泛应用于各种电子设备和系统中。随着科技的不断进步和应用领域的扩展&#xff0c;变阻器的未来发展趋势和前景备受关注。 未来变阻器将趋向于智能化和多功能化&#xff0c;随着物联网、人工智能等技术的快速发展&…

其他:python语言绘制案例

文章目录 介绍导入python包图1图2 介绍 python语言的科研绘图合集&#xff0c;数据来源Hydrogen-diffusion-and-water-rock-reaction 导入python包 import pandas as pd import glob import proplot as pplt import seaborn as sns import numpy as np import matplotlib.py…

java时间复杂度与空间复杂度的排序

怎么理解时间复杂度和空间复杂度 时间复杂度和空间复杂度一般是针对算法而言&#xff0c;是衡量一个算法是否高效的重要标准。先纠正一个误区&#xff0c;时间复杂度并不是算法执行的时间&#xff0c;再纠正一个误区&#xff0c;算法不单单指冒泡排序之类的&#xff0c;一个循…

小程序智能视频制作SDK解决方案,云端智能视频制作

无论是个人分享生活的点滴&#xff0c;还是企业展示品牌故事&#xff0c;一段精心制作的视频总能迅速抓住观众的眼球&#xff0c;传递无限价值。专业视频制作往往门槛较高&#xff0c;不仅需要专业的技能和设备&#xff0c;还耗费大量时间和精力。面对这一挑战&#xff0c;美摄…