您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

时间:2019-08-21 10:31:26  来源:  作者:

首先MySQL8号称性能是mysql5的2倍以上,并且一直听讲单表500万数据是一个瓶颈,那么我打算在最新版的mysql上导入一个1000万数据,验证看看mysql对于单表大数据的表现情况。

mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

mysql数据导入测试


环境准备

  • 在虚拟机中安装好mysql8.0.17,存储引擎选择innoDB,并新增一个study数据库,并创建t_user表,为简单起见,就2个字段,id和name;为减少网络可能存在问题,执行的sql放到本地执行。不需要建立索引,毕竟导入大数据,有索引的话,还需而外维护,那性能更慢。
create table t_user(id int, name varchar(20));
  • 虚拟机配置调整,为充分使用虚拟机的性能,调整虚机配置,4个cpu,4g内存,10g的数据盘。
mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

 

由于硬盘是固态盘,相信更多的瓶颈在cpu和内存。限于配置,也只能评估个大概耗时。

生成sql测试文件

拼这个sql很简单,随便用什么语言,只要生产sql文件就行,单条的语句为:

insert into t_user values('1','程序不就是0和1');

这里我使用JAVA来生成sql文件,1000万数据大概花了45秒左右,实现代码截图参考图1,结果参考图2

mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

图1:生成sql文件


mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

图2:1千万条数据

这个文本文件比较大,在mac上有580多M,光打开都要花一定的时间,所以可以想象,如果通过远程方法导入,对网络延时要求肯定很高。

方案1:存储过程导入

先来看看存储过程导入千万条数据耗时,存过就不需要文件了,直接在过程体中循环拼接insert语句即可。代码如下:

begin
DECLARE v_i int unsigned DEFAULT 0;
 WHILE v_i < 10000000 DO
 insert into t_user values(v_i,'程序不就是0和1');
 SET v_i = v_i+1;
 END WHILE;
mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

存储过程耗时

总耗时大约3个小时3分钟,还是比较慢的。

方案2:用mysql命令导入

mysql命令是mysql自带的命令,位于bin目录下,该命令比较简单,为了避免网络延迟,我们先把用java生成的sql文件传到服务器上,使用rz命令进行上传到mysql的bin目录下,这样执行命令稍微简单点,输入用户名和密码即可执行。

这里有个地方需要注意下:因为sql文件较大,默认的话会报一个错误:ERROR 2006 (HY000): MySQL server has gone away,意思是记录数超过最大值。我们可以更改全局变量,只在本次mysql进程中有效,重启mysql就失效了,如果想一直生效,可以在my.cnf中配置。更改后,就可以执行导入命令了。

set global max_allowed_packet=1024*1024*1000;##设置为1G
mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

上传sql文件到服务器

 ./mysql -uroot -p study1 < t_user.sql 

总共耗时大约3小时8分钟,跟第一种方案区别不大。总结一下,对于大批量数据基本不能使用insert into 的方案,改用文本导入方案。所以我们重新生成数据文件。java代码更改如下:

mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

 

使用制表符号作为数据分隔符,方便下面命令使用。

方案3:用mysqlimport命令导入

mysql从安全考虑,默认对这种导入文件的方式是关闭的,可以用该命令查询:

show variables like 'local_infile';
mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

 

在全局环境中打开可以使用命令:

set global local_infile=ON;

如过没有打开此参数,而执行了mysqlimport命令会收到一个报错:ERROR 1148 (42000): The used command is not allowed with this MySQL version。

mysqlimport命令的常用参数介绍:

  • --fields-terminated-by=字符串:设置字段间的分隔符,可以为单个或多个字符。默认值为制表符“t”,这就是上述我们生成文件时候故意使用制表符。
  • -L, --local:表示从客户端任意路径读取文件导入表中,未设置该选项时,默认只从datadir下同名数据库目录下读取文件导入。
  • -p, --password[=name]:指定用户密码。
  • -u, --user=name:指定登入MySQL用户名。

我们现在执行下面命令执行导入:

 ./mysqlimport -uroot -p --local study2 t_user.txt 

备注:

  1. 上面重新生成的数据文件(t_user.txt),同样先上传服务器。
  2. 文件名默认就是要导入的表名。
  3. 耗时大约1分18秒。

mysqlimport其实是load data infile 的命令行工具,理论讲它们速度应该是一样的,所以就不再演示load data infile 命令了。

数据有了,看看查询效率

因为默认没有索引,所以随便查一个数据,大约耗时14秒。

select * from t_user where id = 1
mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

 

加上索引之后,耗时几乎为0。忽略不计

mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

 

可见千万的单表数据在走索引情况下,mysql其实还是可以扛住的。

总结

直接看图吧

mysql千万级数据量插入的几种方案耗时,看完就知道如何选择

 

基本上在大数据导入的情况下,mysqlimport命令耗时可以忽略不计了。只不过使用该命令需要打开local_infile参数。



Tags:mysql   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  Tags: mysql  点击:(7)  评论:(0)  加入收藏
一、为什么要搭建主从架构呢1.数据安全,可以进行数据的备份。2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据...【详细内容】
2021-12-15  Tags: mysql  点击:(12)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  Tags: mysql  点击:(18)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  Tags: mysql  点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  Tags: mysql  点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  Tags: mysql  点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  Tags: mysql  点击:(17)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  Tags: mysql  点击:(21)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  Tags: mysql  点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Tags: mysql  点击:(31)  评论:(0)  加入收藏
▌简易百科推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  爱可生    Tags:MySQL   点击:(7)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  python数据分析    Tags:MySQL记录锁   点击:(18)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  linux上的码农    Tags:mysql   点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  元宇宙iwemeta    Tags:mysql   点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  吴彬的分享    Tags:Mysql数据库   点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  秃头码哥    Tags:MySQL数据库   点击:(17)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  笨鸟学数据分析    Tags:MySQL   点击:(21)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  笨鸟学数据分析    Tags:SQL语句   点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Java云海    Tags:分布式锁   点击:(31)  评论:(0)  加入收藏
MySQL的进阶查询 一、 按关键字排序 使用ORDERBY语句来实现排序排序可针对一个或多个字段ASC:升序,默认排序方式 【升序是从小到大】DESC:降序 【降序是从大到小】ORDER BY的...【详细内容】
2021-11-05  Java热点    Tags:SQL语句   点击:(28)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条