使用JDBC操作Mysql进行insert,用value还是values?

本文通过对比在MySQL中使用value与values关键字进行批量插入操作的性能差异,发现使用values可以显著提升JDBC批量插入效率。在相同的测试环境下,values的使用使插入时间从2秒减少到0.3秒。进一步的测试表明,这种性能差异由JDBC引起,而非MySQL本身。

一个简单的insert语句 

insert into t(name,price,score) value(?,?,?)

我们首先要知道在mysql中,value和values都是被支持的,我有时候写的时候没有注意,今天发现,这两个居然有性能差别。

测试环境mysql8.0,JDBC8.0

    @Test
    public void test() throws SQLException {
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dianping?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true", "root", "1234");
        String sql = "insert into t(name,price,score) values(?,?,?)";
        Instant start = Instant.now();
        connection.setAutoCommit(false);
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        for(int i=0;i<10000;i++){
            preparedStatement.setString(1, randomStr());
            preparedStatement.setDouble(2, randomPrice());
            preparedStatement.setInt(3, randomScore());
            preparedStatement.addBatch();
        }
        preparedStatement.executeBatch();
        connection.commit();
        preparedStatement.clearBatch();
        Instant end = Instant.now();
        System.out.println("花费时间:"+ Duration.between(start, end).toMillis());
    }

 

写value,用时2s
写values,用时0.3秒

这正是神奇了,虽然这在 MySQL 中是正确,但是 MySQL Connector/J 却无法将它改写为一条正确的多值插入语句。毕竟“value”在 SQL Server 中是不合法的。

我们来测试这是mysql引起的还是JDBC中引起的,我们在mysql中创建一个存储过程

elimiter //
drop procedure if exists insertT;
CREATE PROCEDURE insertT (in count int(11))
begin 
	DECLARE i int DEFAULT 0;
	start TRANSACTION;
	while i < count DO
		insert into st(name) value(rand_str(20));
		set i=i + 1;
	end while;
	COMMIT;
end//
delimiter ;

利用存储过程来进行插入。

最终测试我们可以看出,在存储过程中不管是写value还是values,对插入时间没有任何的影响,很明显,这肯定是因为JDBC引起的,反正要记住,在使用JDBC进行插入的时候,要写values。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值