作者:多米音乐_34024963 | 来源:互联网 | 2023-08-31 13:46
一个简单的insert语句insertintot(name,price,score)value(?,?,?)我们首先要知道在mysql中,value和values
一个简单的insert语句
insert into t(name,price,score) value(?,?,?)
我们首先要知道在mysql中,value和values都是被支持的,我有时候写的时候没有注意,今天发现,这两个居然有性能差别。
测试环境mysql8.0,JDBC8.0
&#64;Testpublic void test() throws SQLException {Connection connection &#61; DriverManager.getConnection("jdbc:mysql://localhost:3306/dianping?serverTimezone&#61;Asia/Shanghai&rewriteBatchedStatements&#61;true", "root", "1234");String sql &#61; "insert into t(name,price,score) values(?,?,?)";Instant start &#61; Instant.now();connection.setAutoCommit(false);PreparedStatement preparedStatement &#61; connection.prepareStatement(sql);for(int i&#61;0;i<10000;i&#43;&#43;){preparedStatement.setString(1, randomStr());preparedStatement.setDouble(2, randomPrice());preparedStatement.setInt(3, randomScore());preparedStatement.addBatch();}preparedStatement.executeBatch();connection.commit();preparedStatement.clearBatch();Instant end &#61; Instant.now();System.out.println("花费时间:"&#43; Duration.between(start, end).toMillis());}
写value&#xff0c;用时2s
写values&#xff0c;用时0.3秒
这正是神奇了&#xff0c;虽然这在 MySQL 中是正确&#xff0c;但是 MySQL Connector/J 却无法将它改写为一条正确的多值插入语句。毕竟“value”在 SQL Server 中是不合法的。
我们来测试这是mysql引起的还是JDBC中引起的&#xff0c;我们在mysql中创建一个存储过程
elimiter //
drop procedure if exists insertT;
CREATE PROCEDURE insertT (in count int(11))
begin DECLARE i int DEFAULT 0;start TRANSACTION;while i end//
delimiter ;
利用存储过程来进行插入。
最终测试我们可以看出&#xff0c;在存储过程中不管是写value还是values&#xff0c;对插入时间没有任何的影响&#xff0c;很明显&#xff0c;这肯定是因为JDBC引起的&#xff0c;反正要记住&#xff0c;在使用JDBC进行插入的时候&#xff0c;要写values。