日期:2014-05-16 浏览次数:20473 次
 转自: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");