前言

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

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

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

mysql> create database test;Query OK, 1 row affected (0.02 sec)mysql> use test;Database changedmysql> 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)

测试时每次实验结束都要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)

这样子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.14581w  1.079310w 5.546006100w 38.930997

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

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

测试代码:

insert into mytable values (null,"value"),    (null,"value"),    ......    (null,"value");
数据量 时间(s)1k  0.151w  0.8010w 2.14100w *

方法四:导入数据文件

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

数据文件(a.dat):

null valuenull value.....null valuenull value
mysql> load data local infile "a.dat" into table mytable;
数据量 时间(s)1k  0.131w  0.7510w 1.97100w 6.751000w 58.18

总结

更多相关文章

  1. 《Android和PHP最佳实践》官方站
  2. android用户界面之按钮(Button)教程实例汇
  3. TabHost与RadioGroup结合完成的菜单【带效果图】5个Activity
  4. Android(安卓)UI开发第十七篇——Android(安卓)Fragment实例(Lis
  5. Android——Activity四种启动模式
  6. Android布局(序章)
  7. Android发送短信方法实例详解
  8. Android(安卓)读取资源文件实例详解
  9. android 蓝牙通讯

随机推荐

  1. The "Android" command is deprecated.
  2. Android 抽屉式
  3. 2013.09.09——— android 判断存储卡是
  4. 关于Google Map API V2 版本的定位与导航
  5. Android oncreate中获取控件宽高
  6. Android 按字母排序的通讯录
  7. android计算器布局(TableLayout)
  8. android dom4j sax 兼容问题
  9. 跟我学Android应用开发 之 Android中资源
  10. Android ndk 入门4 - C++实现