前言

最近因为工作的需要,要在Mysql里插入大量的数据大约1000w,目测会比较耗时。所以现在就像测试一下到底用什么插入数据的方法比较快捷高效。

下面就针对每一种方法分别测试不同数据量下的插入效率。

测试数据库的基本与操作如下:

mysql> create database test;
Query OK, 1 row affected (0.02 sec)
mysql> use test;
Database changed
mysql> create table mytable(id int primary key auto_increment ,value varchar(50));
Query OK, 0 rows affected (0.35 sec)
mysql> desc mytable;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra  |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| value | varchar(50) | YES | | NULL |  |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)

方便测试,这里建了一个表,两个字段,一个是自增的id,另一个是字符串表示内容。

测试时每次实验结束都要mysql> truncate mytable,来清空已存在的表。

方法一:逐条插入

测试代码:(中间有1000条insert语句,用vim复制粘贴比较方便,写完后保存到a.sql,然后在mysql提示符中输入source a.sql)

set @start=(select current_timestamp(6));
insert into mytable values(null,"value");
......
insert into mytable values(null,"value");
set @end=(select current_timestamp(6));
select @start;
select @end;

输出结果:

Query OK, 1 row affected (0.03 sec)
......
Query OK, 1 row affected (0.03 sec)
Query OK, 0 rows affected (0.00 sec)
+----------------------------+
| @start   |
+----------------------------+
| 2016-05-05 23:06:51.267029 |
+----------------------------+
1 row in set (0.00 sec)
+----------------------------+
| @end   |
+----------------------------+
| 2016-05-05 23:07:22.831889 |
+----------------------------+
1 row in set (0.00 sec)

总共耗时31.56486s,事实上几乎每条语句花的时间是差不多的,基本就是30ms。

这样子1000w的数据就得花87h。

至于更大的数据量也就不试了,这种方法肯定不可取。

方法二:基于事务的批量插入

实际上就是把这么多的查询放在一个事务中。事实上方法一中没一条语句都开了一个事务,因此才会特别慢。

测试代码:(与方法一基本类似,主要添加两行,由于比较快,这里测试了多种数据量)

set @start=(select current_timestamp(6));
start transaction;
insert into mytable values(null,"value");
......
insert into mytable values(null,"value");
commit;
set @end=(select current_timestamp(6));
select @start;
select @end;

测试结果:

数据量 时间(s)
1k  0.1458
1w  1.0793
10w 5.546006
100w 38.930997

看出来基本是对数时间,效率还是比较高的。

方法三:单条语句一次插入多组数据

就是一条insert一次插入多个value。

测试代码:

insert into mytable values (null,"value"),(null,"value"),......(null,"value");

测试结果:

数据量 时间(s)
1k  0.15
1w  0.80
10w 2.14
100w *

看上去也是对数时间,而且比方法二要稍微快一点。不过问题在于单次SQL语句是有缓冲区大小限制的,虽然可以修改配置让他变大,但也不能太大。所以在插入大批量的数据时也用不了。

方法四:导入数据文件

将数数据写成数据文件直接导入(参照上一节)。

数据文件(a.dat):

null value
null value
.....
null value
null value

测试代码:

mysql> load data local infile "a.dat" into table mytable;

测试结果:

数据量 时间(s)
1k  0.13
1w  0.75
10w 1.97
100w 6.75
1000w 58.18

时间最快,就是他了。。。。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家的支持。

Mysql中几种插入效率的实例对比相关推荐

  1. MySQL中添加或插入语句(Insert)的几种使用方式

    1.各大培训机构,价格10万的视频 Java架构师视频免费送 2.各种电子书籍经典Java书籍免费送 3.关注下方我的公众号进行免费获取 MySQL中添加或插入语句(Insert)的几种使用方式 1. ...

  2. Mysql中4种常见的插入方式

    4种常见insert方式 准备工作 CREATE TABLE `identity_table` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id' ...

  3. mysql中sql批量插入_MySQL批量SQL插入性能优化

    对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长. 特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的 ...

  4. Mysql 中获取刚插入的自增长id的值

    1 insert into user (username,password) VALUES ('zyl','123'); 2 //获取刚插入的自增长id的值 3 select last_insert_ ...

  5. mysql中sql批量插入_sql中insert如何批量插入多条记录?

    sql中insert如何批量插入多条记录? sql中insert批量插入多条记录的方法: 常见的insert语句,向数据库中,一条语句只能插入一条数据:insert into persons (id_ ...

  6. mysql中哪种方式可以开启一个事务_网易技术类笔试题-2016

    一.单选题 1.下面两个结构体 struct One{ double d; char c; int i; } struct Two{ char c; double d; int i; } 在#prag ...

  7. MySQL中你可能忽略的COLLATION实例详解

    文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 前言 MySQL 数据库 ...

  8. mysql中两种备份方法的优缺点_Mysql两种存储引擎的优缺点

    MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用.MyISAM中,一个table实际保存为三个文件,.frm存储表定义,.MYD存储数据,.MY ...

  9. MySQL中四种方式给字段添加索引

    MySQL中给字段创建索引的四种方式: 添加主键 ALTER TABLE tbl_name ADD PRIMARY KEY (col_list); 该语句添加一个主键,这意味着索引值必须是唯一的,且不 ...

最新文章

  1. Ant Design 入门-参照官方文档使用组件
  2. Delphi中的进制转换
  3. acl 允许同网段访问_ENSP模拟交换环境中调用高级ACL限制不同网段之间互访
  4. 百度地图出现网格,不显示地图
  5. 邮件服务器拦截与反垃圾邮箱的相关方法
  6. python100爬取
  7. 几何画板椭圆九种画法_几何画板怎么制作椭圆定义演示动画?
  8. 手把手教你linux系统安装和完美配置
  9. 2018最新最全1803win10专业版,教育版,企业版和ltbs密钥分享
  10. 最小生成树求最大比率 UVALive - 5713
  11. android 时区表以及设置系统时区
  12. 算法刷题记录(Day 73)
  13. 云和大数据,铺就宁夏特色“信息高速路”
  14. 子平格局——从旺格/从强格
  15. 最新小笑授权系统源码V6.5+开心免授权版
  16. 怎么在html的表格中加筛选,excel中表头合并单元格的筛选
  17. 用伪类添加翘边阴影::before和::after
  18. verification和validation的区别
  19. 你怎么看待互联网创业的国外问卷调查?
  20. 小身材也有强劲性能,树莓派2代B型图形界面搞机

热门文章

  1. c ++查找字符串_C ++异常处理| 查找输出程序| 套装1
  2. Java LinkedList公共对象pollLast()方法(带示例)
  3. 汉子编码比字母编码长_字母/博客作者编码问题(使用动态编程)
  4. 奥鹏东北大学作业答案计算机网络,东北大学17秋学期《计算机网络》在线作业1参考答案...
  5. qt没有mysql文件夹_qt5-qt目录下没有mysql文件夹
  6. 3dmax镜像后模型线条乱了_3dMax入门教程来啦!小白赶紧收藏!
  7. mnist手写数字数据集_mnist手写数据集(1. 加载与可视化)
  8. 面试官问:一个Java字符串中到底能有多少个字符?
  9. 如何选择c语言学习书籍
  10. C++函数的用法:erase函数