MySQL批量更新和批量更新的不同值实现方法
MySQL更新语句对更新数据字段很简单,通常是这样编写的。
复制代码代码如下所示:
更新表设置这个行业'value'where other_field 'other_value= =;
如果相同的字段被更新为相同的值,MySQL也非常简单,修改的地方:
复制代码代码如下所示:
更新表设置这个行业= 'value'where other_field在('other_values);
注意这里的other_values '是一个逗号(,)分隔的字符串,如1,2,3
如果为不同的值更新了一些数据,那么很多人都会写这个:
复制代码代码如下所示:
foreach(display_order美元美元美元ID序号){
为SQL =更新目录设置display_order = $序号id是$id;
mysql_query($ SQL);
}
它是一个循环的更新记录。一个记录是更新,性能不好,很容易引起阻塞。
那么,是否可以使用SQL语句进行批处理更新呢MySQL没有提供直接的方法来实现批处理更新,但它可以用一点技巧来完成。
复制代码代码如下所示:
更新表
设置这个行业=事件ID
当1 then'value
当2 then'value
当3 then'value
结束
在ID(1,2,3)
这是一个用于实现批量更新的小技术。
例如 uff1a
复制代码代码如下所示:
更新:
集display_order =事件ID
1岁到3岁
2岁到4岁
3岁到5岁
结束
在ID(1,2,3)
这个SQL的意思是更新display_order场。如果ID = 1,display_order的值是3,如果id = 2,那么display_order值是4,如果是display_order ID = 3,该值为5。
也就是说,要一起编写条件语句。
此处的位置不影响代码的执行,但它将提高SQL执行的效率。确保SQL语句只执行需要修改的行数,这里只更新3个数据,WHERE子句确保只执行3行数据。
如果更新了多个值,只需要稍加修改即可。
复制代码代码如下所示:
更新:
集display_order =事件ID
1岁到3岁
2岁到4岁
3岁到5岁
结束,
标题=案例ID
当1 then'new标题1
当2 then'new标题2
当3 then'new标题3
结束
在ID(1,2,3)
在这里,MySQL语句已经完成,以更新多个记录。
但是要在业务中使用它,您需要结合服务器端语言。这里,以PHP为例来构建这个MySQL语句:
复制代码代码如下所示:
display_order美元=阵列(
1=4,
2=1,
3=2,
4=3,
5=9,
6=5,
7=8,
8 = 9
);
ID =崩溃美元(',',array_keys($ display_order));
为SQL =更新目录设置display_order =事件ID;
foreach(display_order美元美元美元ID序号){
为SQL = sprintf(当%d %d美元后,美元的ID,序);
}
在id($ id);
sql $;
在这个例子中,有8条记录要更新。代码很容易理解,你学过吗
性能分析
当我用成千上万的记录更新MySQL时,我发现使用最原始的批量更新显示性能不佳。在线总结有三种方法。
1。批量更新,一次记录更新,性能不佳
复制代码代码如下所示:
更新test_tbl集博士、'2'where ID = 1;
2.replace或插入…关于重复密钥更新
复制代码代码如下所示:
替换成test_tbl(ID,DR)的值(1,2'),(2,3'),…(X,Y);
或使用
复制代码代码如下所示:
插入test_tbl(ID,DR)的值(1,2'),(2,3'),…(X,Y)重复;
三.创建一个临时表,首先更新临时表,然后从临时表更新
代码遵循复制代码如下所示
创建临时表(ID int(4)主键,varchar博士(50));
插入TMP值(0,离开了),(1,'xx),…(m,'yy);
更新test_tbl,TMP组test_tbl。博士= tmp.dr test_tbl ID = tmp.id那里;
注意:此方法要求用户具有临时表的创建权限。
以下是上述方法更新100000数据的性能测试结果。
一次一次更新
真正的0m15.557s
用户0m1.684s
Sys 0m1.372s
替换
真正的0m1.394s
用户0m0.060s
系统0m0.012s
插入到重复密钥更新中
真正的0m1.474s
用户0m0.052s
系统0m0.008s
创建临时表和更新:
真正的0m0.643s
用户0m0.064s
系统0m0.004s
就测试结果而言,当时的替代性能更好。
复制密钥更新中的替换和插入之间的区别是:
在删除之前,替换操作本质上是一个重复记录的插入,如果更新的字段不将丢失的字段设置为默认值。
插入是一个更新的重复记录,不改变其他字段。