前言
最近因为工作的需要,要在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
时间最快,就是他了。。。。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
在这种情况下,接口的所有不同实现是如何表现的?当选择一种实现而不是另一种实现时,利弊是什么?
本文向大家介绍JavaScript数组去重的几种方法效率测试,包括了JavaScript数组去重的几种方法效率测试的使用技巧和注意事项,需要的朋友参考一下 以下是我针对网上三种高效率方法总结与效率测试,如果大家有更好的意见或建议也可以提出,大家共勉学习。 数组去重法1: 数组去重法2: 数组去重法3: 效率测试方法: 效率测试结果: 总结 以上就是关于JavaScript几种数组去重的方法效率测试
new clone() 通过反射机制创建 //用 Class.forName方法获取类,在调用类的newinstance()方法 Class<?> cls = Class.forName("com.dao.User"); User u = (User)cls.newInstance(); 序列化反序列化 //将一个对象实例化后,进行序列化,再反序列化,也可以获得一个对象(远程通信的场景下使用) O
本文向大家介绍MySQL索引失效的几种情况汇总,包括了MySQL索引失效的几种情况汇总的使用技巧和注意事项,需要的朋友参考一下 一.索引不存储null值 更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引,只能全表扫描。 为什么索引列不能存Null值? 将索引列值进行建树,其中
问题内容: 我有一个可能包含数千个对象的模型。我想知道什么是最有效的方式来存储它们并在获得ID后检索单个对象。ID是长数字。 这些是我正在考虑的两个选项。在选项一中,它是一个带有递增索引的简单数组。在选项2中,如果有区别,它是一个关联数组,也可能是一个对象。我的问题是,当我主要需要检索单个对象时,有时又遍历它们并进行排序时,哪一个效率更高。 具有非关联数组的选项一: 选项2与关联数组: 更新: 好
本文向大家介绍Mysql索引会失效的几种情况分析,包括了Mysql索引会失效的几种情况分析的使用技巧和注意事项,需要的朋友参考一下 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 2.对于多列索引,不是使用的第
本文向大家介绍c++几种基本的插入排序(图文),包括了c++几种基本的插入排序(图文)的使用技巧和注意事项,需要的朋友参考一下 1.插入排序 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后
本文向大家介绍java中拼接字符串的5种方法效率对比,包括了java中拼接字符串的5种方法效率对比的使用技巧和注意事项,需要的朋友参考一下 前言 最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,所以下面就来测试下面,话不多说了,来一起看看详细的介绍吧。 示例代码 第一种:33809 第二种:8851 第三种:6 第四种:12 第五种:7 性能:StringBuilder>Str