十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的

需求是 上传Excel 读取里面的数据。根据Excel中某一个字段,与数据表中的一个字段的唯一性。然后把 Excel表中数据和数据库表中数据一次更改。本次测试一次更新31条数据。 本次测试基于帝国cms

方法1 用一个for徐循环把读取的数据放在一个数组中然后在十几万条的数据表中逐条查询更改,用时35s;

$numArr = count($arr);
$m = ceil($numArr/10000);
for($i=1;$i<=$numArr;$i++){
$n = $i*10000;
$j = $n-10000;
for($q=$j;$q<$n;$q++){
$res = $empire->query("update {$dbtbpre}enewsclass set bname=‘".$arr[$i][1]."‘,classpagekey=‘".$arr[$i][2]."‘,intro=‘".$arr[$i][3]."‘ where classpath=‘".$arr[$i][i]."‘");
if($res){
echo "更新成功!路径信息为:".$arr[$i][0];
}
}
}

方法 二;创建临时表。用时23s

$sqls ="DROP TABLE IF EXISTS `linshitbale`;\n";
$sqls .="create Temporary table linshitbale (id int(11) primary key auto_increment,classpath varchar(255),bname varchar(255),intro varchar(255),classpagekey varchar(255));\n";
$bsql ="";
foreach ($arr as $k => $v) {
$k+=1;
$bsql .="(".$k.",‘".$v[0]."‘,‘".$v[1]."‘,‘".$v[3]."‘,‘".$v[2]."‘),";
}
$bsql = trim($bsql,",");
$sqls .= "insert into linshitbale values ".$bsql.";\n";

$sqls .= "update {$dbtbpre}enewsclass as c,linshitbale as ls set c.bname=ls.bname,c.intro=ls.intro,c.classpagekey=ls.classpagekey where c.classpath = ls.classpath;";

echo $sqls;

第三种方法 :稍加修改批量更新的方法。用时0.9s

UPDATE mytable

 SET myfield1 = CASE id

 WHEN 1 THEN ‘myvalue11‘

 WHEN 2 THEN ‘myvalue12‘

 WHEN 3 THEN ‘myvalue13‘

 END,

 myfield2 = CASE id

 WHEN 1 THEN ‘myvalue21‘

 WHEN 2 THEN ‘myvalue22‘

 WHEN 3 THEN ‘myvalue23‘

 END

WHERE id IN (1,2,3)

$classpath = array();
$bname = array();
$intro = array();
$classpagekey = array();
foreach ($arr as $key => $value) {
$classpath[] = $value[0];
$bname[] = $value[1];
$intro[] = $value[3];
$classpagekey[] = $value[2];
}

$classpaths = implode("‘,‘", array_values($classpath));
$classpaths = "‘".$classpaths."‘";
$sql = "UPDATE {$dbtbpre}enewsclass\n SET bname = CASE classpath \n";
foreach ($bname as $k=>$v) {
$sql .= sprintf("WHEN ‘%s‘ THEN ‘%s‘ \n", $classpath[$k], $v);
}
$sql .= " END,\n intro = CASE classpath \n";
foreach ($intro as $key1 => $value1) {
$sql .=sprintf("WHEN ‘%s‘ THEN ‘%s‘ \n",$classpath[$key1],$value1);
}
$sql .= " END,\n classpagekey = CASE classpath \n";
foreach ($classpagekey as $key2 => $value2) {
$sql .=sprintf("WHEN ‘%s‘ THEN ‘%s‘ \n",$classpath[$key2],$value2);
}
$sql .= " END\n WHERE classpath IN ($classpaths)";

$result = $empire->query("$sql");
if($result){
echo "success";
}else{
echo "error";
}

如有不懂可以私聊我。qq 517190435

原文地址:https://www.cnblogs.com/songadmin/p/10871022.html

时间: 05-15

十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的的相关文章

Sql语句批量更新数据(多表关联)

最近在项目中遇到一个问题,原来设计的功能是不需要一个特定的字段值depid的,但是新的功能需要根据depid来展现,于是出现了这样一个问题,新增加的数据都有正确的depid,而原来的大量的数据就没有depid或者说depid不是想要的,面临要批量更新原来数据depid的问题. 更新涉及到三个表base_cooperativeGroup,base_groupuser,base_user. 列出表结构: 1.base_cooperativeGroup 2.base_groupuser 3.base_

Mybatis批量更新数据

Mybatis批量更新数据 第一种方式 [html] view plain copy print? <update id="updateBatch" parameterType="Map"> update aa   set a=#{fptm}, b=#{csoftrain} where c in <foreach collection="cs" index="index" item="item&qu

度量快速开发平台:网格部件批量更新数据

在快速开发平台中,如何批量更新网格部件数据?今天给大家介绍平台下的2种方法: 方法一: 利用快速开发平台自身的智能向导,快速构建数据的批量更新功能. 批量更新数据函数:SetColumnValue(stringfiledName,objectvalue,intscope) 作用 获取焦点行的字段的值. 参数 参数一:fieldName      string类型,字段名称. 参数二:value     object类型,更新的值. 参数三:scope     int类型,更新的范围.     更

spring jdbcTemplate批量更新数据

方法:先实现BatchPreparedStatementSetter接口,然后再调用JdbcTemplate的batchUpdate(sql,setter)操作,参数sql是预编译语句 ,setter是BatchPreparedStatementSetter的一个实例.或者使用内部匿名类方式. BatchPreparedStatementSetter接口 public interface BatchPreparedStatementSetter{ public int getBatchSize(

使用PreparedStatement向数据表中插入、修改、删除、获取Blob类型的数据

Blob介绍 BLOB类型的字段用于存储二进制数据 MySQL中,BLOB是个类型系列,包括:TinyBlob.Blob.MediumBlob.LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同. MySQL的四种BLOB类型 类型       大小(单位:字节) TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G Oracle LOB介绍 LOB,即Large Objects(大对象),是用来存储大量的二

mysql批量更新数据(性能优化)

最近做的游戏,上线后出了不少问题,所以我就经常去查数据库数据,翻各种日志等,但是在查询的时候发现好蛋疼,有些地方的时间是写 "2016-08-11 20:13:02"这种格式,有些地方的时间是写 "1470917582000"这种格式,然后多张表数据进行对比的时候就很蛋疼,我得不停进行时间转换,恶心得不行.最后实在忍不了,我要统一时间格式(由于时间都是单独一个字段记录,所以比较好处理),两种格式,很明显,对于查数据来说,第一种格式更直观,所以就决定了,将数据库日志类

转载--批量更新数据(性能优化)

最近做的游戏,上线后出了不少问题,所以我就经常去查数据库数据,翻各种日志等,但是在查询的时候发现好蛋疼,有些地方的时间是写 "2016-08-11 20:13:02"这种格式,有些地方的时间是写 "1470917582000"这种格式,然后多张表数据进行对比的时候就很蛋疼,我得不停进行时间转换,恶心得不行.最后实在忍不了,我要统一时间格式 (由于时间都是单独一个字段记录,所以比较好处理),两种格式,很明显,对于查数据来说,第一种格式更直观,所以就决定了,将数据库日志

DropDownList 绑定数据后 插入一条不属于表中的数据

ddlFGiftId.DataSource = dtGift; ddlFGiftId.DataTextField = "FGiftName"; ddlFGiftId.DataValueField = "FGiftName"; ddlFGiftId.DataBind(); ddlFGiftId.Items.Insert(0, new ListItem("==不使用赠送==", "0")); ddlFGiftId.Selected

REPEATABLE-READ下批量更新数据的问题

1. 当前mysql的隔离级别 REPEATABLE-READ 2. 用户读取的时候或者更改的时候(通过事务)   会对 更改的数据加行锁 和 gap锁 , 最终更改完毕后 去掉锁. (行锁表示这条数据不能更改, gap锁表示这个索引区域不能被重建) 3. 更改数据无索引的情况, 会锁定全部表,这个很恐怖,不是锁定索引了.(GAP锁是更改数据的时候每遍历一次数据就会加一个gap锁)

MVC4实现批量更新数据

Html: @using (Html.BeginForm("Edit", "Home")) { <div> <input type="submit" value="保存" class="delete" /> </div> <table> <tr> <th>@Html.CheckBox("chackall")</