表格
+-----------+--------------+------+-----+-------------------+----------------+ | 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/