Mysql中几种插入效率的实例对比
16lz
2021-12-31
前言
最近因为工作的需要,要在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
总结
更多相关文章
- 《Android和PHP最佳实践》官方站
- android用户界面之按钮(Button)教程实例汇
- TabHost与RadioGroup结合完成的菜单【带效果图】5个Activity
- Android(安卓)UI开发第十七篇——Android(安卓)Fragment实例(Lis
- Android——Activity四种启动模式
- Android布局(序章)
- Android发送短信方法实例详解
- Android(安卓)读取资源文件实例详解
- android 蓝牙通讯