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

2760

被折叠的 条评论
为什么被折叠?



