mysql - 为什么 MySQL 插入比 JDBC 慢?

标签 mysql jdbc

表格

+-----------+--------------+------+-----+-------------------+----------------+
| Field     | Type         | Null | Key | Default           | Extra          |
+-----------+--------------+------+-----+-------------------+----------------+
| id        | int(11)      | NO   | PRI | NULL              | auto_increment |
| name      | varchar(32)  | NO   |     | NULL              |                |
| pid       | varchar(32)  | NO   |     | NULL              |                |
+-----------+--------------+------+-----+-------------------+----------------+

procedure:test

begin
  set @i=0;
  while @i<200 do
    insert into test.table_test
      (name, pid) values ('1', '1');
    set @i=@i+1;
  end while;
end

运行:

mysql> call test();
Query OK, 0 rows affected (17.24 sec)

但是当我用 jdbc 插入数据时,插入 10^5 行只需要大约 9 秒(如果我使用批量插入,插入 10^5 行只需要大约 2.4 秒)。

java代码:

static String mySqlUrl="jdbc:mysql://127.0.0.1:3306/test?rewriteBatchedStatements=true";

static String sql = "insert into bael_test(name, pid) values(?, ?)"; 

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 <= 100000; x++){            
            prest.setString(1, "name");
            prest.setString(2, "pid");
            prest.addBatch();    
            if(x%point==0){
                    prest.executeBatch();      
                    conn.commit();
            }
        }        
        long b=System.currentTimeMillis();  
        print("MySql batch insert 10^5 rows",a,b,point);
    } catch (Exception ex) {  
        ex.printStackTrace();  
    }finally{  
        close(conn);    
    }  
} 

那么为什么 MySQL 插入比 JDBC 慢?

最佳答案

您的 Java 代码使用准备好的语句,而您的 MySQL 代码没有。

换句话说,您的过程必须在循环的每一步检查查询的语法是否正确,以及在磁盘上定位表,而准备好的语句仅执行此操作,并且只会将值插入到没有进一步处理的正确位置。

如果你想比较,你可以使用PREPARE -> http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html

只是凭内存写的,所以它可能是错误的:

PREPARE stmt1 FROM 'INSERT INTO test.table_test (name,pid) values(?,?)';
while @i<200 do
    EXECUTE stmt1 USING @i, @i;;
    set @i=@i+1;
  end while;
DEALLOCATE PREPARE stmt1;

关于mysql - 为什么 MySQL 插入比 JDBC 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474235/

相关文章:

mysql - SQL 查询适用于 SQL Server 但不适用于 MySQL

php - 安装迁移 (laravel) 期间 mysql 服务器已经消失错误

java - 嵌入 Tomcat : NoInitialContextException when trying to get a DataSource

java - Java中处理异常的正确方法

jquery - 在 vuejs 中使用 jQuery 数据表

php - 如何在mysql中得到不重复的结果

mysql - 计算多个sql表的百分比

java - JDBC Realm 表单例份验证如何

sql - 如何返回带有排序数据库结果的 ROW_NUMBER() ?

java - 如何在Java中更新Sqlite中的ResultSet