您的位置:首页 > 数据库 > MySQL

MySQL 插入(insert)性能测试

2016-04-25 17:54 603 查看
转自: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条

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

测试代码:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: