日期:2014-05-16  浏览次数:20351 次

数据库批量数据插入问题分析

转自: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表:

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");

  输出结果:

  commonInsert()执行时间为:13828ms

  二、普通插入+手动提交:setAutoCommit(false)、commit()

  代码:

 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");

  输出结果:

  commonInsert()执行时间为:13813ms

  对比分析:

  可以看出,仅仅是这种方式的设置,对性能的影响并不大。

  三、普通插入+手动提交