码迷,mamicode.com
首页 > 数据库 > 详细

mysql批量数据导入探究

时间:2016-01-22 17:23:36      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

最近工作碰到一个问题,如何将大量数据(100MB+)导入到远程的mysql server上。

 

 

尝试1:  

  Statement执行executeBatch的方法。每次导入1000条记录。时间为12s/1000条。比较慢。

  对于1M次的插入这意味着需要4个多小时,期间还会因为网络状况,数据库负载等因素而把载入延迟提升到85s/1000条甚至更高。  

  效果较差。

 

 尝试2:

  使用PreparedStatement,该方法需要预先给定insert操作的“格式”。

  实测用这种方式插入的效率为每秒钟数十行。

  注意,将rewriteBatchedStatements设为true之后,在不到一分钟时间里面就将78万条数据全部导入数据库了。这是一个行之有效的方法。

  代码:

 1 import java.io.BufferedReader;
 2 import java.io.FileReader;
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.PreparedStatement;
 6 
 7 /**
 8  *
 9  */
10 public class PreparedStatementTestMain {
11     private static PreparedStatement ps;
12     public static void main(String[] args) {
13         try{
14             Class.forName("com.mysql.jdbc.Driver");
15             Connection conn = DriverManager.getConnection("jdbc:mysql://remote-host/test?user=xxx&password=xxx");
16             String sql = "insert into test values(?,?,?,?,?,?,?,?,?,?,?)";
17             ps = conn.prepareStatement(sql);
18 
19             BufferedReader in = new BufferedReader(new FileReader("xxxx"));
20             String line;
21             int count =0;
22             while((line = in.readLine())!=null){
23                 count+=1;
24                 String[] values = line.split("\t",-1);
25                 //ps.setInt(1,count);
26                 for(int i =1;i<values.length;i++) {
27 //                    if(i==6){
28 //                        ps.setInt(i+1,Integer.parseInt(values[i]));
29 //                    }else{
30 //                    if(values[i]==null){
31 //                        ps.setString(i," ");
32 //                    }else {
33                         ps.setString(i, values[i]);
34 //                    }
35 //                    }
36                 }
37                 ps.addBatch();
38                 System.out.println("Line "+count);
39             }
40             ps.executeBatch();
41             ps.close();
42         }catch(Exception e){
43             e.printStackTrace();
44         }
45     }
46 }

 

尝试3:

  使用mysqlimport工具。经过实测,速度接近于尝试2中加上rewriteBatchedStatements之后的速度。不过前提是数据必须要保存为文件。

  

  

 

rewriteBatchedStatements到底为什么对速度优化这个多?

  一种说法:这样做的目的是为了让mysql能够将多个mysql insert语句打包成一个packet和mysql服务器通信。这样可以极大降低网络开销。

  另一种说法:

  Rewriting Batches

  ? “rewriteBatchedStatements=true”

     ? Affects (Prepared)Statement.add/executeBatch()

  ? Core concept - remove latency

  ? Special treatment for prepared INSERT statements

  ——Mark Matthews - Sun Microsystems

 

PreparedStatement VS Statement

  数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的使用中重用。

 

mysql批量数据导入探究

标签:

原文地址:http://www.cnblogs.com/xiamodeqiuqian/p/5150743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!