• 1
  • 0
分享

1、一次插入多行数据

插入行所需的时间是由以下因素决定的:

・连接:30%

・向服务器发送查询:20%

・解析查询:20%

・插入行:10% x 行的大小

・插入索引:10% x 索引数

・结束:10%

这是引用 参考MySQL 5.7参考手册

可以发现,大部分时间是消耗在客户端与服务器之间的通信,

所以,我们就可以使用insert包含多个值来减少客户端和服务器之间的通信。

为了能更直观的看到效果,

我们还是老规矩,

上例子,在例子中看效果。

1.1 准备测试表及数据

创建测试表及写入数据。

 /* 使用ClassDJ这个database */
use ClassDJ;   
 /* 如果表d1存在则删除表t1 */
drop table if exists d1;
 /* 创建表d1 */
 CREAT TABLE ‘d1’ (
'id' int(11) NOT NULL AUTO_INCREMENT,
'a' varchar(20) DEFAULT NULL ,
'b' int(20) DEFAULT NULL ,
'c' datetime NOT NULL  DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)
)ENGINE=InnoDB CHARSET=utf8mb4 ;
/* 如果存在存储过程insert_d1,则删除 */
drop procedure if exists insert_d1;
delimiter;;
/* 创建存储过程insert_d1 */
create procedure insert_d1()
begin
   /* 声明变量i */
  declare i int;
  /* 设置i的初始值为1 */
  set i = 1;
   /* 对满足i<=1000的值进行while循环 */
  while(i<=1000) do
    /* 写入表d1中a、b两个字段,值都为i当前的值 */
    insert into d1(a.b) vlaue(i,i);   
    set i=i+1;
  end while;
end;;
delimiter;
 /* 运行存储过程insert_d1 */
call insert_d1() ;

创建数据的例子,小鱼在《从入门到入坟,深度理解MySQL之:如何让order by、group by查询速度飞起来》有写过。

没看到的,或者好奇的大佬们,可以去瞅一瞅,瞧一瞧。

1.2 导出一条 SQL 包含多行数据的数据文件

为了获取批量导入数据的 SQL,首先对测试表的数据进行备份,备份的 SQL 为一条 SQL 包含多行数据的形式。

命令执行

mysqldump -ucarl_dj -p'123456' -h127.0.0.1 --set-gtid-purged=off --single-transaction --skip-add-locks  ClassDJ d1 >d1.sql

参数解析

参数解析
-ucarl_dj用户名
-p’123456’ 密码
-h127.0.0.1 连接的MySQL服务端IP
set-gtid-purged=off 不添加SET @@GLOBAL.GTID_PURGED
–single-transaction 设置事务的隔离级别为可重复读,即REPEATABLE READ,这样能保证在一个事务中所有相同的查询读取到同样的数据
–skip-add-locks 取消每个表导出之前加lock tables操作。
ClassDJ 库名
d1 表名
d1.sql 导出数据文件名

查看d1.sql文件内容

......
DROP TABLE IF EXISTS `d1`;
/* 按照上面的备份语句备份的数据文件包含drop命令时,需要特别小心,在后续使用备份文件做导入操作时,应该确定所有表名,防止drop掉业务正在使用的表 */
......
CREATE TABLE `d1`......
......
INSERT INTO `d1` VALUES (1,'1',1,'2020-11-04 03:44:10'),(2,'2',2,'2020-11-04  03:44:10'),(3,'3',3,'2020-11-04  03:44:10')......
......

1.3 导出一条SQL只包含一行数据的数据文件

命令执行

mysqldump -ucarl_dj -p'123456' -h127.0.0.1 --set-gtid-purged=off --single-transaction --skip-add-locks --skip-extended-insert ClassDJ d1 >d1_row.sql

参数解析

参数解析
–skip-extended-insert一条SQL一行数据的形式导出数据

查看d1_row.sql文件内容

......
INSERT INTO `d1` VALUES (1,'1',1,'2020-11-04 03:44:10');
INSERT INTO `d1` VALUES (2,'2',2,'2020-11-04 03:44:10');
INSERT INTO `d1` VALUES (3,'3',3,'2020-11-04 03:44:10');
......

1.4 导入时间的对比

一、先导入一条SQL包含多条数据的的数据文件

命令执行

time mysql -ucarl_dj -p'123456' -h127.0.0.1 ClassDJ <d1.sql

结果显示

real0m0.214s
user0m0.010s
sys0m0.007s

可以看到,耗时时间是 0.214秒

二、我们再来导入一个SQL只包含一条数据的数据文件:

命令执行

time mysql -ucarl_dj -p'123456' -h127.0.0.1 ClassDJ <d1_row.sql

结果显示

real0m32.315s
user0m0.066s
sys0m0.192s

可以看到, 执行时间是 32.315秒

1.5 结论

一次插入多行花费时间0.214秒左右,

一次插入一行花费了32.315秒,

这样一对比,你的选择,是不是就非常的明确了呢~~

Nice

所以,

如果大批量导入时,记得使用一条insert语句插入多行数据的方式。

2 、关闭自动提交

2.1 对比开启和关闭自动提交的效率

Autocommit 开启时会为每个插入执行提交。可以在InnoDB导入数据时,关闭自动提交。

命令执行

SET autocommit=0;
INSERT INTO `d1` VALUES (1,'1',1,'2020-11-04 03:44:10');
INSERT INTO `d1` VALUES (2,'2',2,'2020-11-04 03:44:10');
INSERT INTO `d1` VALUES (3,'3',3,'2020-11-04 03:44:10');
......
COMMIT;

这里可以看到,

我们使用的是 d1_row.sql这个文件的内容;

在前后分别追加了两行参数:

前面追加内容:

SET autocommit=0;

最后追加的内容:

COMMIT;

然后呢,

我们再重新导入这个数据文件,看看效率有没有提升。

命令执行

time mysql -ucarl_dj -p'123456' -h127.0.0.1 ClassDJ <d1_row.sql

显示结果

real 0m2.360s
user0m0.059s
sys   0m0.208s

嗯,看到没,

在没有关闭自动提交, 时间是 32.315秒;

关闭自动提交后,时间是 2.360秒;

所以:

大批量导入时,关闭自动提交,让多条 insert 一次提交,也可以大大提升导入速度。

3、 总结

所以,提升数据导入速率,可以:

・一次插入的多行值;

・关闭自动提交,多次插入数据的 SQL 一次提交。

总之,找到自己最适合的方法,就是好的 方法。

关于SQL的进阶篇,可以看:

深聊MySQL,从入门到入坟之:MySQL竟然也有后悔药!!!

我是奕然

     CSDN博客专家

     51Testing认证讲师

关注我,带你学习更多更专业的测试开发知识。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 常用的Android自动化测试框架包括UIAutomator、Appium以及Monkeyrunner等;其中,UIAutomator是谷歌在发布Android4.1版本时推出的一款基于Java语言的UI测试框架,由此,UIAutomator只能运行在4.1及其以上版本中。本篇文章将为大家介绍如何搭建基于Java+UIAutomator的测试环境。一、UIAutomator简介首先,作为Google自家推出的一款开源的UI自动化测试框架,其稳定性和可靠性可以得到极大的保障,运行时也有更多的权限。其次,UIAutomator可以跨进程操作,运行速度较快;但是UIAutomator不支持Andro...
            0 3 2955
            分享
          • 本文主要的内容是使用Jmeter对数据库进行数据的操作,包括单条语句的增删改查,多条语句的增删改查,本文主要介绍操作流程,关于流程的运作原理,对原理感兴趣的同学可自行查阅资料。首先需要准备一个数据库驱动Jar包【mysql-connector-java-bin.jar】可以直接百度下载,版本不建议特别低,jar包需要Jmeter引用才能使用,jar包引用如下:将jar放入Jmeter安装/解压文件路径:eg:D:\apache-jmeter-5.0\apache-jmeter-5.0\lib下,需要重启Jmeter才能生效驱动包的作用:没有数据库驱动,就不能连接数据库,Jmeter在没有驱动的...
            14 14 1911
            分享
          •   由于种种原因,我们可能避免不了需要离线安装selenium。  这不?经过下午几个小时的奋战,终于把selenium到的本地离线终于搞定了。  废话不多说,直接上操作步骤:  1、去官网(下载地址:https://pypi.org/project/selenium/#history)去下载selenium版本。  2、此处强烈大家建议下载selenium的3.0+的版本(此处省略一万字),我给的地址可以让你直接进入选择历史版本的跳转页面。  3、往下拉,到3左右的版本,点击版本信息。(我选择的是3.14.1)  4、页面会跳转到这个版本的详情页面,点击“Download files”按钮,...
            0 0 3194
            分享
          •   摘要:金三银四, 是求职者蠢蠢欲动的季节,亦是企业摩拳擦掌的季节。  今年是疫情开放后,第一个金三银四, 所以,很多求职者和企业都很期待,也很重视。  为什么这样说?因为作为企业的一名金牌面试官,我收到的内推简历的数量, 就比平时多了不少,更别说社招投递简历了。同时,就整个大环境而言,除了近期某森哲的裁员消息之外,其他的互联网大厂相对来说还算稳定,也是复苏的节奏。  尤其是在OpenAI的加持下,以及国家对人工智能领域的推广,在整个人工智能领域的需求还是蛮大的。  所以,为了能让求职者更快找到工作, 今天我们就来聊一聊面试官的心理。也就是从面试官的角度,如何筛选简历、如何挑选求职者。  面...
            0 0 1109
            分享
          •   法国监管机构现已正式接受苹果公司的 iOS 更新,并允许 iPhone 12 在法国本土重新上市销售,但不允许在全球法属地区销售。法国国家频率局(ANFR)在 2023 年 9 月声称,iPhone 12 超过了该国的射频暴露特定吸收率(SAR),但苹果公司对此提出了异议,并且不同于国际测试。  禁令发布时,正值 iPhone 15 上市,苹果公司已将 iPhone 12 从其产品系列中删除。  但第三方经销商仍在销售,最重要的是,法国还威胁要将产品召回。  苹果公司发布了专门针对法国的 iOS 更新版本,该版本将降低蜂窝调制解调器的无线电强度。9 月下旬,法国官员宣布他们已经批准了苹果公...
            0 0 1168
            分享
      • 51testing软件测试圈微信