日期:2014-05-16 浏览次数:20401 次
转自:http://doc.chinaunix.net/sqlserver/200909/209625.shtml 在数据库的相关开发中,经常会遇到数据的批量插入问题。本文主要是通过实验的方式探讨批量数据插入的瓶颈,以及优化建议。 以10w条记录的插入作为实验对象,采用下面的几种方法插入: 1. 普通插入:普通的一条条插入 2. 普通插入+手动提交:setAutoCommit(false)、commit() 3. 普通插入+手动提交+ prepareStatement方式 4. 批量插入:addBatch、executeBatch 5. 批量插入:insert into tableName (x,xx,xxx) values(x,xx,xxx),(xx,xxx,xxxx)…, 6. 多线程插入。 7. InnoDB引擎和MyISAM引擎的比较。 实验环境: 数据库:MySQL 5.0 机器硬件: 内存 3G CPU AMD双核4400+ 2.3G 首先建立一个简单的user表: 一、普通插入 代码: 输出结果: commonInsert()执行时间为:13828ms 二、普通插入+手动提交:setAutoCommit(false)、commit() 代码: 输出结果: commonInsert()执行时间为:13813ms 对比分析: 可以看出,仅仅是这种方式的设置,对性能的影响并不大。 三、普通插入+手动提交
CREATE TABLE `user` (
`id` varchar(50) NOT NULL,
`seqid` bigint(20) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`seqid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 1Connection conn=source.getConnection();
2Statement s=conn.createStatement();
3String sql="";
4long start=System.currentTimeMillis();
5for(int i=0;i<100000;i++)
6{
7 sql="insert into user(id,name) value('"+(i+1)+"','chenxinhan')";
8 s.execute(sql);
9}
10s.close();
11conn.close();
12long end=System.currentTimeMillis();
13System.out.println("commonInsert()执行时间为:"+(end-start)+"ms"); 1Connection conn=source.getConnection();
2conn.setAutoCommit(false);
3Statement s=conn.createStatement();
4String sql="";
5long start=System.currentTimeMillis();
6for(int i=0;i<100000;i++)
7{
8 sql="insert into user(id,name) value('"+(i+1)+"','chenxinhan')";
9 s.execute(sql);
10}
11conn.commit();
12s.close();
13conn.close();
14long end=System.currentTimeMillis();
15System.out.println("commonInsert()执行时间为:"+(end-start)+"ms");