MySql 插入(insert)性能测试 zt
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);
- }
- }
- }