0
点赞
收藏
分享

微信扫一扫

mysql千万数据加索引


mysql批量更新多表数据

mysql批量更新多表数据

update库2.tb,库1.tbset库2.tb.body=库1.tb.bodywhere库2.tb.id=库1.tb.id

千万数据量的表, 执行根据ID去update一条数据不会很慢吧

mysql批量更新如果一条条去更新效率是相当的慢,循环一条一条的更新记录,一条记录update一次,这样性能很差,也很容易造成阻塞。

mysql批量更新共有以下四种办法

1、.replaceinto批量更新

replaceintotest_tbl(id,dr)values(1,'2'),(2,'3'),...(x,'y');

2、insertinto...onduplicatekeyupdate批量更新

insertintotest_tbl(id,dr)values(1,'2'),(2,'3'),...(x,'y')onduplicatekeyupdatedr=values(dr);

3.创建临时表,先更新临时表,然后从临时表中update

createtemporarytabletmp(idint(4)primarykey,drvarchar(50));

insertintotmpvalues(0,'gone'),(1,'xx'),...(m,'yy');

updatetest_tbl,tmpsettest_tbl.dr=tmp.drwheretest_tbl.id=tmp.id;

注意:这种方法需要用户有temporary表的create权限。

4、使用mysql自带的语句构建批量更新

mysql实现批量可以用点小技巧来实现:

UPDATEyoiurtable

SETdingdan=CASEid

WHEN1THEN3

WHEN2THEN4

WHEN3THEN5

WHEREidIN(1,2,3)

这句sql的意思是,更新dingdan字段,如果id=1则dingdan的值为3,如果id=2则dingdan的值为4……

where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

如果更新多个值的话,只需要稍加修改:

UPDATEcategories

SETdingdan=CASEid

WHEN1THEN3

WHEN2THEN4

WHEN3THEN5

title=CASEid

WHEN1THEN'NewTitle1'

WHEN2THEN'NewTitle2'

WHEN3THEN'NewTitle3'

WHEREidIN(1,2,3)

到这里,已经完成一条mysql语句更新多条记录了。

php中用数组形式赋值批量更新的代码:

$display_order=array(

1=>4,

2=>1,

3=>2,

4=>3,

5=>9,

6=>5,

7=>8,

$ids=implode(',',array_keys($display_order));

$sql="UPDATEcategoriesSETdisplay_order=CASEid";

foreach($display_orderas$id=>$ordinal){

$sql.=sprintf("WHEN%dTHEN%d",$id,$ordinal);

$sql.="ENDWHEREidIN($ids)";

echo$sql;

这个例子,有8条记录进行更新。代码也很容易理解,你学会了吗

更新100000条数据的性能就测试结果来看,测试当时使用replaceinto性能较好。

replaceinto和insertintoonduplicatekeyupdate的不同在于:

replaceinto操作本质是对重复的记录先delete后insert,如果更新的字段不全会将缺失的字段置为缺省值,用这个要悠着点否则不小心清空大量数据可不是闹着玩的。

insertinto则是只update重复记录,不会改变其它字段。

mysql 批量更新10000+的数据,有什么效率比较高的方法

首先, 插入上万条数据,对于数据库来说并不是“很大”的工作量,一般配置的笔记本电脑都可以在1分钟内完成。 所以最简单、最灵活的办法还是写SQL语句。

如果不希望DB编译器每次执行都编译SQL的话,可以使用存储过程,直接调用,性能上会好很多。也比较简单。

(几万条数据怎么地也得要时间去处理,所以不可能特别快的。)

如果由于各种原因,导致这个插入还是很慢, 而且你的MYSQL又是5.0以上版本的话,可以使用BulkCopy来进行批量操作。

BulkCopy的原理就是Client直接把一个数组(DataTable)传给DB,然后传入表名,所有的编译、操作都由DB自己完成,效率很高。

引用MySql.Data.dll , 调用MysqlBulkCopy函数即可。

这个函数在处理海量数据插入的时候效率尤为明显, 小量数据反而没什么优势,而且由于传入的DataTable格式必须和表的字段一模一样(空的列也要传进去),导致C#要写很多代码来构造这个数组,所以要你自己权衡用还是不用。

我在自己的电脑上批量插入一亿条数据,Insert写法大概需要1小时,BulkCopy大概只需要5分钟。同问。。。

mysql数据批量更新,谢谢

mysql数据批量更新

update a set b=1 where id in ($ids) and id !=$_GET['id'];

update a set b=0 where id not in ($ids) and id !=$_GET['id'];update a set b=1 where id in ($ids) and id !=$_get['id']; update a set b=0 where id not in ($ids) and id !=$_get['id']; 这样应该可以解决你问题,怎么把两条语句合并,我就不清楚了,你查查

举报

相关推荐

0 条评论