首页 > 后端开发 > 正文

php里面有多条UPDATE怎么优化?

2025-03-02 15:13:33 | 我爱编程网

最近经常有小伙伴私信询问php里面有多条UPDATE怎么优化?相关的问题,今天,我爱编程网小编整理了以下内容,希望可以对大家有所帮助。

本文目录一览:

php里面有多条UPDATE怎么优化?

php里面有多条UPDATE怎么优化?

没有你说的这样夸张吧

如果只是这一个表,更新几万行 应该是秒级的

我自己做了例子测试了一下,(不过我是在sqlserver下测试的)

create table t
(
bai int,
shi int,
ge int,
he int,
ji int,
mmax int,
mmin int

)

然后插入了100万数据

declare @a int
set @a=0
while @a<1000000
begin
insert into t  (bai,shi,ge) values(@a,@a+1,@a+2)
set @a=@a+1
end

为了得到最大最小值,用了一个标量函数

create function compare(@r0 int,@r1 int,@r2 int,@flag int)
returns int
as
begin
  declare @tmp int
  set @tmp = @r0
  if @flag=1 --1max,0 min
  begin
  if(@tmp < @r1)
    set @tmp = @r1
  if(@tmp < @r2)
    set @tmp = @r2
  end
  else
  begin
    if(@tmp > @r1)
    set @tmp = @r1
  if(@tmp> @r2)
    set @tmp = @r2
  end
  return @tmp
end

然后做update,我填充的数字比较大,所以ji的计算不一样

update t set he=bai+shi+ge 
UPDATE t SET ji = bai-shi-ge
UPDATE t SET mmax =([dbo].[compare]( bai,shi,ge,1) )  
UPDATE t SET mmin =([dbo].[compare]( bai,shi,ge,0) )

大约需要17秒

如果把这些update合并 我爱编程网

update t set he=bai+shi+ge ,ji = bai-shi-ge,mmax =( [dbo].[compare]( bai,shi,ge,1))  ,mmin =( [dbo].[compare]( bai,shi,ge,0))

用时12秒

至于修改特定一行的数据,要i看你如何选中这个数据了

比如特定的bai,那就加上 where bai=某个值

php里面有多条UPDATE怎么优化?

php递归 无限极分类、分销方法 以tp5为例

无限极分类与分销方法,以tp5框架为例,实现PHP递归功能。

首先,理解无限极分销的核心概念是自上而下和自下而上的层级结构。在自上而下的无限极分销模式中,每个层级的用户都直接隶属于上一层,形成一条清晰的层级链。自下而上的模式则相反,每个用户都可以向下发展自己的分销团队。

在PHP中,递归是解决无限极分类与分销问题的关键。递归函数能够自动处理层级结构的复杂性,无需手动跟踪每个层级的细节。下面是一个以tp5框架实现的无限极分销系统示例代码:

php
class User extends Model {
public function get分销链($userId) {
$this->db->limit(10);
$query = $this->db->select('*')
->from('users')
->where('上级用户ID', $userId)
->order_by('创建时间', 'desc')
->get();
return $query->result_array();
}

public function 更新用户信息($userId, $data) {
return $this->db->where('用户ID', $userId)
->update('users', $data);
}

public function 添加分销关系($fromUserId, $toUserId) {
return $this->db->insert('分销关系', ['上级用户ID' => $fromUserId, '下级用户ID' => $toUserId]);
}
}

这段代码展示了如何在tp5框架中实现用户管理和分销关系的处理。通过`get分销链`函数,可以获取一个特定用户的所有直接下级分销用户,通过`更新用户信息`函数修改用户信息,以及通过`添加分销关系`函数建立新的分销关系。

在实际应用中,可能还需要考虑性能优化、数据安全和用户体验等方面的问题。例如,为了防止循环引用导致的数据库查询性能问题,可以引入一些缓存机制或者设置递归深度限制。同时,确保数据的准确性和安全性,如防止恶意创建分销关系、保护用户隐私等。

总的来说,通过递归算法和适当的框架支持,PHP能够高效地实现无限极分类与分销功能。在设计过程中,结合业务需求和性能考虑,可以进一步完善和优化系统。

Thinkphp怎么批量更新数据

我爱编程网(https://www.52biancheng.com)小编还为大家带来Thinkphp怎么批量更新数据的相关内容。

thinkphp批量更新数据可以参考如下三种方法:
方法一:
//批量修改 data二维数组 field关键字段 参考ci 批量修改函数 传参方式
function batch_update($table_name='',$data=array(),$field=''){
if(!$table_name||!$data||!$field){
return false;
}else{
$sql='UPDATE '.$table_name;
}
$con=array();
$con_sql=array();
$fields=array();
foreach ($data as $key => $value) {
$x=0;
foreach ($value as $k => $v) {
if($k!=$field&&!$con[$x]&&$x==0){
$con[$x]=" set {$k} = (CASE {$field} ";
}elseif($k!=$field&&!$con[$x]&&$x>0){
$con[$x]=" {$k} = (CASE {$field} ";
}
if($k!=$field){
$temp=$value[$field];
$con_sql[$x].= " WHEN '{$temp}' THEN '{$v}' ";
$x++;
}
}
$temp=$value[$field];
if(!in_array($temp,$fields)){
$fields[]=$temp;
}
}
$num=count($con)-1;
foreach ($con as $key => $value) {
foreach ($con_sql as $k => $v) {
if($k==$key&&$key<$num){
$sql.=$value.$v.' end),';
}elseif($k==$key&&$key==$num){
$sql.=$value.$v.' end)';
}
}
}
$str=implode(',',$fields);
$sql.=" where {$field} in({$str})";
$res=M($table_name)->execute($sql);
return $res;
}
//测试
function test(){
$update_array=array();
for ($i=2; $i <7 ; $i++) {
$data=array();
$data['id']=$i;
$data['memeber_type']=2;
$data['memeber_type_state']=1;
$update_array[]=$data;
}
$res=$this->batch_update('yl_member',$update_array,id);
var_dump($res);
}
方法二:
即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。
那么能不能一条sql语句实现批量更新呢?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。
UPDATE categories
SET display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END
WHERE id IN (1,2,3)
这句sql的意思是,更新display_order 字段,如果id=1 则display_order 的值为3,如果id=2 则 display_order 的值为4,如果id=3 则 display_order 的值为5。
即是将条件语句写在了一起。
这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。
如果更新多个值的话,只需要稍加修改:
UPDATE categories
SET display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)
实际运用
$display_order = array(
1 => 4,
2 => 1,
3 => 2,
4 => 3,
5 => 9,
6 => 5,
7 => 8,
8 => 9
);
$ids = implode(',', array_keys($display_order));
$sql = "UPDATE categories SET display_order = CASE id ";
foreach ($display_order as $id => $ordinal) {
$sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal);
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;
方法二不建议使用。
方法三:
/*
* @param $saveWhere :想要更新主键ID数组
* @param $saveData :想要更新的ID数组所对应的数据
* @param $tableName : 想要更新的表明
* @param $saveWhere : 返回更新成功后的主键ID数组
* */
public function saveAll($saveWhere,&$saveData,$tableName){
if($saveWhere==null||$tableName==null)
return false;
//获取更新的主键id名称
$key = array_keys($saveWhere)[0];
//获取更新列表的长度
$len = count($saveWhere[$key]);
$flag=true;
$model = isset($model)?$model:M($tableName);
//开启事务处理机制
$model->startTrans();
//记录更新失败ID
$error=[];
for($i=0;$i<$len;$i++){
//预处理sql语句
$isRight=$model->where($key.'='.$saveWhere[$key][$i])->save($saveData[$i]);
if($isRight==0){
//将更新失败的记录下来
$error[]=$i;
$flag=false;
}
//$flag=$flag&&$isRight;
}
if($flag ){
//如果都成立就提交
$model->commit();
return $saveWhere;
}elseif(count($error)>0&count($error)<$len){
//先将原先的预处理进行回滚
$model->rollback();
for($i=0;$i<count($error);$i++){
//删除更新失败的ID和Data
unset($saveWhere[$key][$error[$i]]);
unset($saveData[$error[$i]]);
}
//重新将数组下标进行排序
$saveWhere[$key]=array_merge($saveWhere[$key]);
$saveData=array_merge($saveData);
//进行第二次递归更新
$this->saveAll($saveWhere,$saveData,$tableName);
return $saveWhere;
}
else{
//如果都更新就回滚
$model->rollback();
return false;
}
}
在测试方法中调用:
public function test(){
//要更新的数据表的主键数组
$where['ID']=array(70,73,74,80,83);
//ID主键数组对应的待更新数据
$save=array(
array('School'=>'DK Univisity01','isExport'=>0),
array('School'=>'DK Univisity02','isExport'=>0),
array('School'=>'DK Univisity03','isExport'=>0),
array('School'=>'DK Univisity04','isExport'=>0),
array('School'=>'','isExport'=>0),
// array('School'=>' Univisity05','isExport'=>0),
);
$f=$this->saveAll($where,$save,'want');
if(count($f['ID'])>0){
//返回更新成功的ID数组
echo "This is success :</br>";
dump($f);
echo 'ok';
}else{
//更新失败操作
echo "This is failed :</br>";
dump($f);
echo 'error';
}
}

以上就是我爱编程网小编整理的内容,想要了解更多相关资讯内容敬请关注我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“php里面有多条UPDATE怎么优化?”相关推荐