`

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); 
        }  
    }  
}  
 
分享到:
评论
1 楼 di1984HIT 2014-07-17  
你好,我用你代码测试一下、

相关推荐

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

    通过这样的性能测试,我们可以了解到在特定场景下,Mybatis和JDBC哪个更适合批量插入操作。通常,Mybatis由于其封装和优化,可能会在易用性和性能之间取得更好的平衡。但具体选择应根据项目需求和实际环境进行权衡。...

    Mysql 性能测试脚本

    通过上述分析,我们可以看出这份MySQL性能测试脚本主要用于模拟大规模数据的批量插入操作,以便对MySQL数据库的性能进行测试。其中涉及到了数据库表结构的设计、数据的批量插入、自定义函数及存储过程的编写等关键...

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

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

    提高mysql插入数据的速度.pdf

    - 尽管这不在文档中直接提及,但提升磁盘I/O性能对于提高MySQL插入速度同样重要。这包括优化文件系统、使用更快的磁盘或者使用SSD等措施。 9. 使用第三方工具监控和管理: - 使用如Unix的top、Windows的任务管理...

    MySQL批量SQL插入各种性能优化.docx

    **综合性能测试** 当同时应用上述三种优化方法时,可以看到性能有显著提升。批量插入减少了日志写入和解析次数,事务处理减少了磁盘I/O,有序插入则优化了索引维护。这些优化策略结合使用,可以显著改善大量数据插入...

    如何优化MySQL insert性能

    在优化MySQL的INSERT性能时,面对大量数据的系统,我们需要考虑如何有效地减少插入时间,以降低潜在的风险和提高系统的稳定性。以下是一些经过测试的有效策略: 1. **批量插入**: - 传统的方式是逐行插入数据,...

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

    为了验证这些方法的效果,可以进行性能测试,比较单条INSERT与批量INSERT、使用事务与不使用事务、无序插入与有序插入在不同数据规模下的表现。测试结果通常会显示,上述优化策略能够显著减少数据导入的时间,尤其是...

    mysql 测试数据集,单表200万条数据

    本测试数据集提供了一张包含200万条数据的单表,这对于数据库性能测试、查询优化、大数据处理以及系统负载测试等方面具有极高的价值。下面将围绕这个主题,详细介绍MySQL数据库的相关知识点。 1. 数据库设计: 在...

    Loadrunner测试数据库性能测试SQL语句性能的脚本例子.pdf

    在插入记录时,使用了 mysql_query 函数来执行 INSERT 语句,并使用了 lr_save_string 函数来保存插入语句。接着,使用了 mysql_query 函数来执行 SELECT 语句,并使用了 lr_error_message 函数来处理错误。 该脚本...

    MySQL现有架构对插入性能的制约1

    MySQL 数据库在处理插入性能时,受到其现有架构的限制,特别是当涉及到批量插入操作时。本文主要讨论了这两种常见的插入语句:“insert table_name values”以及“insert table_name values...”的执行过程,并分析...

    Jmeter的mysql-connector-java-5.1.6-bin.jar包,纯正靠谱,接口测试性能测试相关JAR包

    本文将深入探讨`mysql-connector-java-5.1.6-bin.jar`在JMeter中的应用,以及与接口测试和性能测试的相关知识点。 首先,`mysql-connector-java-5.1.6-bin.jar`是MySQL官方发布的版本为5.1.6的JDBC驱动包。这个驱动...

    mysql大批量数据插入

    MySQL 提供了多种方法来实现大批量数据插入,包括使用批量插入语句、使用 LOAD DATA 语句、使用 MySQL 的 Bulk Insert 机制等。 在 MySQL 中,使用批量插入语句可以大大提高数据插入的速度。批量插入语句的格式如下...

    MYSQL开发性能研究之批量插入数据的优化方法

    为了解决这个问题,MySQL官方推荐使用批量插入,即将多条数据一次性插入,如`INSERT INTO TBL_TEST (id) VALUES (1), (2), (3)`。这种方式减少了网络传输的负担,同时减少了服务器的解析次数,从而提高了性能。 ...

    mysql数据库安装及测试

    ### MySQL 数据库安装与测试详解 #### 一、MySQL 数据库简介 MySQL 是一款非常流行的开源关系型数据库管理系统,因其高性能、稳定性和易用性而被广泛应用于各种规模的应用程序中。MySQL 支持多种操作系统,包括 ...

    Mysql构造百万条测试数据

    Mysql 构造百万条测试数据 在实际应用中,许多企业都拥有庞大的数据量,为了提高...使用 MySQL 构造百万条测试数据需要了解 MySQL 的内存表、函数、存储过程、索引等知识点,并且需要根据实际情况调整参数和优化性能。

    MySQL批量SQL插入性能优化

    针对描述中的内容,本文将详细探讨几种提升MySQL插入性能的方法,适用于处理报表系统等需要大量数据导入的场景。 1. **一次性插入多条数据**: - 传统的做法是逐条插入,例如使用多个独立的INSERT语句。然而,这样...

    nodejs封装好的mysql数据库模块,带mysql连接池以及百万测试数据

    综上所述,这个Node.js模块提供了完整的MySQL数据库操作解决方案,结合连接池和大量测试数据,不仅方便开发者快速构建数据库相关功能,还为性能测试和优化提供了便利。通过深入理解和使用这个模块,可以提升你在Node...

    mysql表添加测试数据函数

    在实际项目开发中,快速填充大量测试数据对于进行性能测试、压力测试等非常有用。例如,在开发电子商务系统时,可能需要模拟大量的交易记录来测试系统的处理能力。通过编写如上所示的存储过程,可以在几分钟内轻松...

Global site tag (gtag.js) - Google Analytics