IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 深聊MySQL:如何优化数据导入? -> 正文阅读

[大数据]深聊MySQL:如何优化数据导入?

一次插入多行数据

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

连接:30%

向服务器发送查询:20%

解析查询:20%

插入行:10% x 行的大小

插入索引:10% x 索引数

结束:10%

可以发现,大部分时间是消耗在客户端与服务器之间的通信,所以,我们就可以使用insert包含多个值来减少客户端和服务器之间的通信。

为了能更直观地看到效果,我们还是老规矩,上例子,在例子中看效果。

准备测试表及数据

创建测试表及写入数据:

 /* 使用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() ;

导出一条 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

参数解析:

在这里插入图片描述

查看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')......
......

导出一条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

参数解析:

图片

查看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');
......

导入时间的对比

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

命令执行:

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

结果显示:

real  0m0.214s
user  0m0.010s
sys    0m0.007s

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

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

命令执行:

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

结果显示:

real  0m32.315s
user  0m0.066s
sys    0m0.192s

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

结论

一次插入多行花费时间0.214秒左右,一次插入一行花费了32.315秒,这样一对比,你的选择,是不是就非常的明确了呢~

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

关闭自动提交

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

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
user    0m0.059s
sys       0m0.208s

看到没?在没有关闭自动提交,时间是32.315秒;关闭自动提交后,时间是 2.360秒。所以:大批量导入时,关闭自动提交,让多条 insert 一次提交,也可以大大提升导入速度。

总结

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

一次插入的多行值;

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

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

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-25 23:15:32  更:2022-09-25 23:16:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:57:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码