当前位置: 首页 > 知识库问答 >
问题:

为什么MySQL insert比JDBC慢?

张高义
2023-03-14
+-----------+--------------+------+-----+-------------------+----------------+
| Field     | Type         | Null | Key | Default           | Extra          |
+-----------+--------------+------+-----+-------------------+----------------+
| id        | int(11)      | NO   | PRI | NULL              | auto_increment |
| name      | varchar(32)  | NO   |     | NULL              |                |
| pid       | varchar(32)  | NO   |     | NULL              |                |
+-----------+--------------+------+-----+-------------------+----------------+
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)
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);    
    }  
} 

共有1个答案

董霖
2023-03-14

您的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;
 类似资料:
  • 我昨天对一个答案发表了评论,其中有人在正则表达式中使用了,而不是或。我说使用范围或数字说明符可能比使用字符集更快。 我决定今天测试一下,并惊讶地发现(至少在C#regex引擎中)似乎比其他两个似乎没有太大区别的任何一个都慢。这是我的测试输出超过10000个随机字符串,其中包含1000个随机字符,其中5077个实际上包含一个数字: 这对我来说是一个惊喜,有两个原因,如果有人能解释一下,我会很感兴趣:

  • 我发现 比 Python 2 和 3 中的函数慢。 Python 2 蟒蛇 3 为什么<code>max</code>(<code>O(n)</code>)比<code>sort</code>函数(<code<O(nlogn)</code>)慢?

  • 主要内容:先决条件,JDBC架构,常见的JDBC组件,JDBC 4.0包JDBC代表Java数据库连接(Java Database Connectivity),它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API,换句话说:JDBC是用于在Java语言编程中与数据库连接的API。 JDBC库包括通常与数据库使用相关,如下面提到的每个任务的API - 连接到数据库 创建SQL或MySQL语句 在数据库中执行SQL或MySQL查询 查看和修改结果记录

  • 问题内容: 示例代码在这里 问题答案: 我认为速度更快,因为使用矢量化方式和熊猫构建在此数组上。 慢,因为它使用。 操作是最快的,然后是。 请参阅此答案,并更好地解释pandas开发人员。

  • 问题内容: 我不知道为什么numba在这里击败numpy(超过3倍)。我在这里进行基准测试时是否犯了一些根本性的错误?对于numpy来说似乎是完美的情况,不是吗?请注意,作为检查,我还运行了一个结合了numba和numpy的变体(未显示),正如预期的那样,它与不带numba的numpy运行相同。 (顺便说一下,这是一个后续问题:数字处理二维数组的最快方法:dataframe vs series v

  • 本文向大家介绍LSTM为什么比RNN好?相关面试题,主要包含被问及LSTM为什么比RNN好?时的应答技巧和注意事项,需要的朋友参考一下 因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸。