MySQL 插入(insert)性能测试

来源:互联网 发布:鉴定古书软件 编辑:程序博客网 时间:2024/06/06 04:59

转自:http://elf8848.iteye.com/blog/1547398


rewriteBatchedStatements=true的重要性。。。。

作者:赵磊

博客:http://elf8848.iteye.com

 

测试环境: 笔记本电脑

CPU:I5 

系统:MAC OS 10.7

内存:8G

硬盘:5400转,笔记本硬盘

 

MySql 版本:Oracle官网下载的mysql-5.5.24-osx10.6-x86_64, 默认安装

MySql JDBC驱动版本:mysql-connector-Java-5.1.20

 

 

MySql建表语句:

 CREATE  TABLE `dev`.`test_insert` (

  `id` INT NOT NULL ,

  `uname` VARCHAR(10) NULL ,

  PRIMARY KEY (`id`) )

 ENGINE = InnoDB;

 

测试结果 :

 

 

创建连接用时355 ms

执行清理操作:成功

每执行100000次sql提交一次事务

MySql非批量插入10万条记录,用时12128 ms,平均每秒执行8245条

----------------------------------

创建连接用时13 ms

执行清理操作:成功

每执行10000次sql提交一次事务

MySql非批量插入10万条记录,用时11667 ms,平均每秒执行8571条

----------------------------------

创建连接用时13 ms

执行清理操作:成功

每执行1000次sql提交一次事务

MySql非批量插入10万条记录,用时11744 ms,平均每秒执行8514条

----------------------------------

创建连接用时12 ms

执行清理操作:成功

每执行100次sql提交一次事务

MySql非批量插入10万条记录,用时14796 ms,平均每秒执行6758条

----------------------------------

创建连接用时15 ms

执行清理操作:成功

每执行10次sql提交一次事务

MySql非批量插入10万条记录,用时15917 ms,平均每秒执行6282条

----------------------------------

创建连接用时14 ms

执行清理操作:成功

每执行1次sql提交一次事务

MySql非批量插入10万条记录,用时89030 ms,平均每秒执行1123条

----------------------------------

创建连接用时13 ms

执行清理操作:成功

每执行100000次sql提交一次事务

MySql批量插入10万条记录,用时1298 ms,平均每秒执行77041条

----------------------------------

创建连接用时16 ms

执行清理操作:成功

每执行10000次sql提交一次事务

MySql批量插入10万条记录,用时1221 ms,平均每秒执行81900条

----------------------------------

创建连接用时12 ms

执行清理操作:成功

每执行1000次sql提交一次事务

MySql批量插入10万条记录,用时1418 ms,平均每秒执行70521条

----------------------------------

创建连接用时15 ms

执行清理操作:成功

每执行100次sql提交一次事务

MySql批量插入10万条记录,用时2252 ms,平均每秒执行44404条

----------------------------------

创建连接用时13 ms

执行清理操作:成功

每执行10次sql提交一次事务

MySql批量插入10万条记录,用时9139 ms,平均每秒执行10942条

----------------------------------

创建连接用时10 ms

执行清理操作:成功

每执行1次sql提交一次事务

MySql批量插入10万条记录,用时80250 ms,平均每秒执行1246条

----------------------------------



测试代码:
package com.devplatform.module.core.dao.jdbc;import java.sql.Connection;  import java.sql.DriverManager;  import java.sql.PreparedStatement;  import java.sql.SQLException;  import java.sql.Statement;/**   MySql 插入(insert)性能测试   Oracle 插入(insert)性能测试MySql建表语句:CREATE  TABLE `dev`.`test_insert` (  `id` INT NOT NULL ,  `uname` VARCHAR(10) NULL ,  PRIMARY KEY (`id`) )ENGINE = InnoDB; */public class JdbcInsterTest {  static int  count=100000;//总次数//一定要写rewriteBatchedStatements参数,Mysql批量插入才性能才理想static String mySqlUrl="jdbc:mysql://127.0.0.1:3306/dev?rewriteBatchedStatements=true";static String mySqlUserName="root";  static String mySqlPassword="1234";  static String oracleurl="jdbc:oracle:thin:@192.168.10.139:1521:orcl";  static String oracleuserName="scott";  static String oraclepassword="tiger"; static String sql = "insert into test_insert(id,uname) values(?,?)"; //每执行几次提交一次static int[] commitPoint={count,10000,1000,100,10,1};    public static void main(String[] args) {      for(int point:commitPoint){            test_mysql(point);      }    for(int point:commitPoint){            test_mysql_batch(point);      }//    for(int point:commitPoint){//            test_oracle(point);  //    }//    for(int point:commitPoint){//            test_oracle_batch(point);  //    }    }          /**     * 创建连接     * @return     */    public static Connection getConn(String flag){    long a=System.currentTimeMillis();        try {                if("mysql".equals(flag)){                Class.forName("com.mysql.jdbc.Driver");                        Connection conn =  DriverManager.getConnection(mySqlUrl, mySqlUserName, mySqlPassword);                     conn.setAutoCommit(false);                  return conn;        }else if("oracle".equals(flag)){                Class.forName("oracle.jdbc.OracleDriver");                        Connection conn =  DriverManager.getConnection(oracleurl, oracleuserName, oraclepassword);                 conn.setAutoCommit(false);                  return conn;        }else{        System.out.println();        throw new RuntimeException("flag参数不正确,flag="+flag);        }        } catch (Exception ex) {              ex.printStackTrace();          }finally{          long b=System.currentTimeMillis();              System.out.println("创建连接用时"+ (b-a)+" ms");         }        return null;    }    /**     * 关闭连接     * @return     */    public static void close(Connection conn){     try {               if(conn!=null){             conn.close();               }         } catch (SQLException e) {               e.printStackTrace();           }    }    /**     * 删除旧数据     * @return     */    public static void clear(Connection conn){    try{            Statement st=conn.createStatement();            boolean bl=st.execute("delete FROM test_insert");            conn.commit();            st.close();            System.out.println("执行清理操作:"+(bl==false?"成功":"失败"));    }catch(Exception e){    e.printStackTrace();    }    }    /**     * 打印信息     * @return     */    public static void print(String key,long startTime,long endTime,int point){    System.out.println("每执行"+point+"次sql提交一次事务");    System.out.println(key+",用时"+ (endTime-startTime)+" ms,平均每秒执行"+(count*1000/(endTime-startTime))+"条");    System.out.println("----------------------------------");    }    /**      * mysql非批量插入10万条记录      */      public static void test_mysql(int point){          Connection conn=getConn("mysql");          clear(conn);        try {                      PreparedStatement prest = conn.prepareStatement(sql);                      long a=System.currentTimeMillis();                for(int x = 1; x <= count; x++){                         prest.setInt(1, x);                         prest.setString(2, "张三");                         prest.execute();                   if(x%point==0){                 conn.commit();                 }              }                      long b=System.currentTimeMillis();                print("MySql非批量插入10万条记录",a,b,point);        } catch (Exception ex) {              ex.printStackTrace();          }finally{              close(conn);            }      }          /**      * mysql批量插入10万条记录      */      public static void test_mysql_batch(int point){          Connection conn=getConn("mysql");          clear(conn);        try {                    PreparedStatement prest = conn.prepareStatement(sql);                    long a=System.currentTimeMillis();              for(int x = 1; x <= count; x++){                        prest.setInt(1, x);                        prest.setString(2, "张三");                        prest.addBatch();                    if(x%point==0){                prest.executeBatch();                      conn.commit();                }            }                    long b=System.currentTimeMillis();              print("MySql批量插入10万条记录",a,b,point);        } catch (Exception ex) {              ex.printStackTrace();          }finally{              close(conn);            }      }          /**      * oracle非批量插入10万条记录      */      public static void test_oracle(int point){          Connection conn=getConn("oracle");          clear(conn);        try {                    PreparedStatement prest = conn.prepareStatement(sql);                    long a=System.currentTimeMillis();              for(int x = 1; x <= count; x++){                        prest.setInt(1, x);                        prest.setString(2, "张三");                        prest.execute();                  if(x%point==0){                conn.commit();                }            }              long b=System.currentTimeMillis();              print("Oracle非批量插入10万记录",a,b,point);        } catch (Exception ex) {              ex.printStackTrace();          }finally{              close(conn);            }      }      /**      * oracle批量插入10万条记录      */      public static void test_oracle_batch(int point){          Connection conn=getConn("oracle");           clear(conn);        try {                    PreparedStatement prest = conn.prepareStatement(sql);                    long a=System.currentTimeMillis();              for(int x = 1; x <= count; x++){                        prest.setInt(1, x);                        prest.setString(2, "张三");                        prest.addBatch();                  if(x%point==0){                prest.executeBatch();                      conn.commit();                }            }              long b=System.currentTimeMillis();              print("Oracle批量插入10万记录",a,b,point);        } catch (Exception ex) {              ex.printStackTrace();          }finally{         close(conn);         }      }  }  


作者:赵磊

博客:http://elf8848.iteye.com

 

测试环境: 笔记本电脑

CPU:I5 

系统:MAC OS 10.7

内存:8G

硬盘:5400转,笔记本硬盘

 

MySql 版本:Oracle官网下载的mysql-5.5.24-osx10.6-x86_64, 默认安装

MySql JDBC驱动版本:mysql-connector-Java-5.1.20

 

 

MySql建表语句:

 CREATE  TABLE `dev`.`test_insert` (

  `id` INT NOT NULL ,

  `uname` VARCHAR(10) NULL ,

  PRIMARY KEY (`id`) )

 ENGINE = InnoDB;

 

测试结果 :

 

 

创建连接用时355 ms

执行清理操作:成功

每执行100000次sql提交一次事务

MySql非批量插入10万条记录,用时12128 ms,平均每秒执行8245条

----------------------------------

创建连接用时13 ms

执行清理操作:成功

每执行10000次sql提交一次事务

MySql非批量插入10万条记录,用时11667 ms,平均每秒执行8571条

----------------------------------

创建连接用时13 ms

执行清理操作:成功

每执行1000次sql提交一次事务

MySql非批量插入10万条记录,用时11744 ms,平均每秒执行8514条

----------------------------------

创建连接用时12 ms

执行清理操作:成功

每执行100次sql提交一次事务

MySql非批量插入10万条记录,用时14796 ms,平均每秒执行6758条

----------------------------------

创建连接用时15 ms

执行清理操作:成功

每执行10次sql提交一次事务

MySql非批量插入10万条记录,用时15917 ms,平均每秒执行6282条

----------------------------------

创建连接用时14 ms

执行清理操作:成功

每执行1次sql提交一次事务

MySql非批量插入10万条记录,用时89030 ms,平均每秒执行1123条

----------------------------------

创建连接用时13 ms

执行清理操作:成功

每执行100000次sql提交一次事务

MySql批量插入10万条记录,用时1298 ms,平均每秒执行77041条

----------------------------------

创建连接用时16 ms

执行清理操作:成功

每执行10000次sql提交一次事务

MySql批量插入10万条记录,用时1221 ms,平均每秒执行81900条

----------------------------------

创建连接用时12 ms

执行清理操作:成功

每执行1000次sql提交一次事务

MySql批量插入10万条记录,用时1418 ms,平均每秒执行70521条

----------------------------------

创建连接用时15 ms

执行清理操作:成功

每执行100次sql提交一次事务

MySql批量插入10万条记录,用时2252 ms,平均每秒执行44404条

----------------------------------

创建连接用时13 ms

执行清理操作:成功

每执行10次sql提交一次事务

MySql批量插入10万条记录,用时9139 ms,平均每秒执行10942条

----------------------------------

创建连接用时10 ms

执行清理操作:成功

每执行1次sql提交一次事务

MySql批量插入10万条记录,用时80250 ms,平均每秒执行1246条

----------------------------------



测试代码:
0 0