需要将大量数据(大概5W条)插入MySQL数
据库,用普通的SQL
Statement执行,时间大概是几分钟。于是想到用PreparedStatement,但是改了之后发现效率并没有很大的提升。不成,想到了
load data local
infile命令,以前一直认为这条命令仅限MySQL终端上使用而不是标准的SQL语句,今天看了几篇文章之后有了很大的收获。
1 使用PreparedStatement batch operation
以前使用PreparedStatement性能没有很大提升的原因在于:
没有使用批处理方法
在语句执行之前应关闭事务自动提交,语句执行完之后再提交
public
void batchLoad(Connection connection)
{
try
{
connectionsetAutoCommit(false);
BufferedReader reader =
new BufferedReader(new
FileReader("tfacts_result"));
String sqlString =
"insert into test(node1, node2, weight) values(, , )";
PreparedStatement pstmt = connectionprepareStatement(sqlString);
String line =
null;
while(true)
{
line = readerreadLine();
if(line == null)
{
break;
}
String[] columns = linesplit("\t");
for(int
i = 1; i <= columnslength; i++)
{
pstmtsetString(i, columns[i-1]);
}
pstmtaddBatch();
}
pstmtexecuteBatch();
connectioncommit();
pstmtclose();
readerclose();
}
catch (FileNotFoundException e) {
eprintStackTrace();
}catch
(SQLException e){
eprintStackTrace();
}catch
(IOException e){
eprintStackTrace();
}
2使用load data local infile into tabel XXX(注意在文件中用\t将每列数据隔开)
public
void loadData(Connection connection)
{
long
starTime = SystemcurrentTimeMillis();
String sqlString =
"load data local infile into table test";
PreparedStatement pstmt;
try
{
pstmt = connectionprepareStatement(sqlString);
pstmtsetString(1,
"tfacts_result");
pstmtexecuteUpdate();
pstmtclose();
}
catch (SQLException e) {
eprintStackTrace();
}
long
endTime = SystemcurrentTimeMillis();
Systemoutprintln("program runs "
+ (endTime - starTime) + "ms");
}
测试了5W条数据,PreparedStatement耗时10s,而load data infile耗时3s。
你就像同一个库中的2个表那样写语句就可以了,只不过要注意的地方就是表名前要增加库名来引用,如: "库名dbo表名"的形式:
插入:
insert into text2dbosp_qwe
select from text1dbosp_qwe where 查询条件
更新:
update t1
set t1要更新的字段=t2同名的字段
from text2dbosp_qwe t1,text1dbosp_qwe t2
where t1关联字段=t2关联字段
你的第2步问题有问题
什么叫做A表中没有的记录。除非你能保证name字段唯一,否则无论采用什么方式你也不可能做到。
第一种方法、不考虑执行效率的方法:
step 1:执行更新 *** 作
UPDATE 表A SET 表Aname=(SELECT 表bname FROM 表b WHERE 表A user_no=表buser_no)
step 2:执行插入 *** 作
INSERT INTO 表A
SELECT FROM 表B WHERE user_no not in
(select user_no from 表A)
第二种方法:
分段更新插入法。
既每次只从B表中取ID为一定范围的记录进行更新和条件插入。
insert是插入数据
update是更新数据
择列表
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。
1、选择所有列
例如,下面语句显示testtable表中所有列的数据:
SELECT FROM testtable
2、选择部分列并指定它们的显示次序
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
3、更改列标题
在选择列表中,可重新指定列标题。定义格式为:
列标题=列名 列名 列标题
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题: SELECT 昵称=nickname,电子邮件=email FROM testtable。
4、删除重复行
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。
以上就是关于如何提高Mysql 批量插入和更新 数据库的效全部的内容,包括:如何提高Mysql 批量插入和更新 数据库的效、sql不同数据库间,同名数据表的资料如何插入、更新、数据库中数据更新问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)