`
阿尔萨斯
  • 浏览: 4149559 次
社区版块
存档分类
最新评论

MySql 插入(insert)性能测试

 
阅读更多

MySql 插入(insert)性能测试

作者:赵磊

博客: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); 
        }  
    }  
}  
分享到:
评论

相关推荐

    Mybatis与JDBC批量插入MySQL数据库性能测试

    Mybatis与JDBC批量插入MySQL数据库性能测试,资源包含文档、代码和数据库。

    mysql-bulk-insert:测试mysql合并插入的吞吐

    mysql合并插入性能测试测试数据Mysql合并插入可以带来*10的吞吐提升,而事务提交没有明显的收益。下面是在一台普通MYSQL机型下的TPS实测数据:[root@10-9-136-206 mysql-bulk-insert]# ...

    MySQL批量SQL插入性能优化详解

    经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。 1. 一条SQL语句插入多条数据。 常用的插入语句如: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) ...

    MySQL实现批量插入以优化性能的教程

    经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。 1. 一条SQL语句插入多条数据。 常用的插入语句如:   INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `...

    如何优化MySQL insert性能

     经过对MySQL的测试,发现一些可以提高insert效率的方法,供大家参考参考。  1、一条SQL语句插入多条数据。  常用的插入语句如: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) ...

    MySQL批量SQL插入性能优化

     经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。  1. 一条SQL语句插入多条数据。  常用的插入语句如:  INSERT INTO `insert_table` (`datetime`, `uid`, `...

    MYSQL

    7.11 DELETE (删除)句法 7.12 SELECT (精选)句法 7.13 JOIN (联接)句法 7.14 INSERT (插入)句法 7.15 REPLACE (替换)句法 7.16 LOAD DATA INFILE (装载数据到文件)句法 7.17 UPDATE ...

    MySQL中文参考手册.chm

    7.9 OPTIMIZE TABLE (优化表) 句法 7.10 DROP TABLE (抛弃表)句法 7.11 DELETE (删除)句法 7.12 SELECT (精选)句法 7.13 JOIN (联接)句法 7.14 INSERT (插入)句法 7.15 REPLACE ...

    MySQL中文参考手册

    o 4.15 安装后期(post-installation)的设置与测试 + 4.15.1 运行mysql_install_db 的问题 + 4.15.2 启动 MySQL 服务器的问题 + 4.15.3 自动启动和停止 MySQL + 4.15.4 选项文件 o 4.16 升级和降级...

    MySQL 5.1中文手冊

    2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在...

    MySQL 5.1参考手册

    2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在...

    MySQL 5.1官方简体中文参考手册

    2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在...

    MySQL 5.1参考手册中文版

    2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6...

    MySQL 5.1参考手册 (中文版)

    2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在...

    超强MySQL课程笔记_V4.0.ctb

    DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据 SELECT C. DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE 3. 数据访问技术 A. ODBC PHP &lt;.php&gt; B. ...

    mysql5.1中文手册

    测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL...

    MySQL 大数据量快速插入方法和语句优化分享

    锁定也将降低多连接测试的整体时间,尽管因为它们... INSERT、UPDATE和DELETE操作在MySQL中是很快的,通过为在一行中多于大约5次连续不断地插入或更新的操作加锁,可以获得更好的整体性能。如果在一行中进行多次插入

    MYSQL中文手册

    2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL ...

Global site tag (gtag.js) - Google Analytics