数据库批量数据插入问题分析
2009-09-22 00:00:00 来源:WEB开发网输出结果:
multiThreadBatchInsert()执行时间为:2437ms
multiThreadBatchInsert()执行时间为:2625ms
multiThreadBatchInsert()执行时间为:2703ms
注意:上面我采用的是三个线程插入30w条数据。
取最大时间为2703ms,较上面的937ms,基本还是三倍的时间。
所以发现此时多线程也解决不了批量数据插入问题。原因就是,这时候的性能瓶颈不是CPU,而是数据库!
七、InnoDB引擎和MyISAM引擎的比较
最后,分析一下,这两个引擎对批量数据插入的影响。
先建立user2数据表:
CREATE TABLE `user2` (
`id` varchar(50) NOT NULL,
`seqid` bigint(20) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`seqid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
代码:
1Connection conn=source.getConnection();
2 conn.setAutoCommit(false);
3 Statement s=conn.createStatement();
4 StringBuilder sql=new StringBuilder("");
5 long start=System.currentTimeMillis();
6 for(int j=0;j<100;j++)
7 {
8 sql=new StringBuilder("");
9 sql.append("insert into user2 (id,name) values ");
10 for(int i=0;i<1000;i++)
11 {
12 if(i==999)
13 sql.append("('").append(i+1).append("',").append("'cxh')");
14 else
15 sql.append("('").append(i+1).append("',").append("'cxh'),");
16 }
17 s.execute(sql.toString());
18 conn.commit();
19 }
20 s.close();
21 conn.close();
22 long end=System.currentTimeMillis();
23 System.out.println("manyInsert2()执行时间为:"+(end-start)+"ms");
输出结果:
manyInsert2()执行时间为:3484ms
注意:第七项的代码和第五是一样的,除了数据表名称不同(user、user2)
但是,
InnoDB :3484ms
MyISAM:937ms
所以,MyISAM引擎对大数据量的插入性能较好。
总结:
对于大数据量的插入,建议使用insert into tableName (x,xx,xxx) values(x,xx,xxx),(xx,xxx,xxxx)…,的方式,引擎建议使用MyISAM引擎。
更多精彩
赞助商链接