Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL更新查询是否有最大数量,通过循环进行查询是否合理?_Php_Mysql_Sql - Fatal编程技术网

Php SQL更新查询是否有最大数量,通过循环进行查询是否合理?

Php SQL更新查询是否有最大数量,通过循环进行查询是否合理?,php,mysql,sql,Php,Mysql,Sql,我需要重写一个表中大量记录中的字段 我计划运行一个PHP循环,就像 foreach($array as $k=>$v) { $sql = "UPDATE table SET `time`='".$v['time']."' WHERE id='".$v['id']."' "; try { $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

我需要重写一个表中大量记录中的字段

我计划运行一个PHP循环,就像

foreach($array as $k=>$v)
{
$sql = "UPDATE table SET `time`='".$v['time']."' WHERE id='".$v['id']."' ";
    try 
        {       
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);       
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
          echo $stmt->rowCount(); // 1
        } catch(PDOException $e) {
          echo 'Error: ' . $e->getMessage();
        }
}
其中,阵列有近300000个元素

我不知道这是太多,还是微不足道?我是否有这样破坏服务器的危险

我可以一次对50000个条目进行数组切片,但这似乎有点麻烦。这是一个MySQL数据库


我的服务器有2GB的“真实”内存,其中1.6是空闲的。

既然您使用的是PDO,为什么不准备一次语句,然后在循环的每次迭代中使用不同的参数执行它呢

$pdo->setAttribute(pdo::ATTR_ERRMODE,pdo::ERRMODE_异常);
$pdo->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);
$stmt=$pdo->prepare('updatetableset-time=?其中id=?');
foreach($v数组){
试一试{
$stmt->execute(数组($v['time'],$v['id']);
echo$stmt->rowCount();//1
}捕获(PDO$e){
回显“错误:”。$e->getMessage();
}
}

既然您使用的是PDO,为什么不准备一次语句,然后在循环的每次迭代中使用不同的参数执行它呢

$pdo->setAttribute(pdo::ATTR_ERRMODE,pdo::ERRMODE_异常);
$pdo->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);
$stmt=$pdo->prepare('updatetableset-time=?其中id=?');
foreach($v数组){
试一试{
$stmt->execute(数组($v['time'],$v['id']);
echo$stmt->rowCount();//1
}捕获(PDO$e){
回显“错误:”。$e->getMessage();
}
}

既然您使用的是PDO,为什么不准备一次语句,然后在循环的每次迭代中使用不同的参数执行它呢

$pdo->setAttribute(pdo::ATTR_ERRMODE,pdo::ERRMODE_异常);
$pdo->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);
$stmt=$pdo->prepare('updatetableset-time=?其中id=?');
foreach($v数组){
试一试{
$stmt->execute(数组($v['time'],$v['id']);
echo$stmt->rowCount();//1
}捕获(PDO$e){
回显“错误:”。$e->getMessage();
}
}

既然您使用的是PDO,为什么不准备一次语句,然后在循环的每次迭代中使用不同的参数执行它呢

$pdo->setAttribute(pdo::ATTR_ERRMODE,pdo::ERRMODE_异常);
$pdo->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);
$stmt=$pdo->prepare('updatetableset-time=?其中id=?');
foreach($v数组){
试一试{
$stmt->execute(数组($v['time'],$v['id']);
echo$stmt->rowCount();//1
}捕获(PDO$e){
回显“错误:”。$e->getMessage();
}
}

您应该对当前的体系结构进行基准测试,以确定当前的方法(硬件、内存、配置等)是否能够完成任务

然而,我可以看到,您当前的实现中存在一个明显的错误,因为它没有利用准备好的语句(重用语句)的许多好处。以下内容可能会使性能提高2倍

  $sql = "UPDATE table SET `time`= :time WHERE id=:id ";
  $stmt = $pdo->prepare($sql);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);       
  foreach ($array as $k=>$v) {
      try {       
        $prepared = array('time' => (int)$v['time'], 'id' => (int)$v['id']);
          $stmt->execute($prepared);
        } catch(PDOException $e) {
        echo 'Error: ' . $e->getMessage();
      }
    }
  }

但是,请针对您的特定体系结构进行基准测试和验证

您应该对当前的体系结构进行基准测试,以确定当前的方法(硬件、内存、配置等)是否能够胜任任务

然而,我可以看到,您当前的实现中存在一个明显的错误,因为它没有利用准备好的语句(重用语句)的许多好处。以下内容可能会使性能提高2倍

  $sql = "UPDATE table SET `time`= :time WHERE id=:id ";
  $stmt = $pdo->prepare($sql);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);       
  foreach ($array as $k=>$v) {
      try {       
        $prepared = array('time' => (int)$v['time'], 'id' => (int)$v['id']);
          $stmt->execute($prepared);
        } catch(PDOException $e) {
        echo 'Error: ' . $e->getMessage();
      }
    }
  }

但是,请针对您的特定体系结构进行基准测试和验证

您应该对当前的体系结构进行基准测试,以确定当前的方法(硬件、内存、配置等)是否能够胜任任务

然而,我可以看到,您当前的实现中存在一个明显的错误,因为它没有利用准备好的语句(重用语句)的许多好处。以下内容可能会使性能提高2倍

  $sql = "UPDATE table SET `time`= :time WHERE id=:id ";
  $stmt = $pdo->prepare($sql);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);       
  foreach ($array as $k=>$v) {
      try {       
        $prepared = array('time' => (int)$v['time'], 'id' => (int)$v['id']);
          $stmt->execute($prepared);
        } catch(PDOException $e) {
        echo 'Error: ' . $e->getMessage();
      }
    }
  }

但是,请针对您的特定体系结构进行基准测试和验证

您应该对当前的体系结构进行基准测试,以确定当前的方法(硬件、内存、配置等)是否能够胜任任务

然而,我可以看到,您当前的实现中存在一个明显的错误,因为它没有利用准备好的语句(重用语句)的许多好处。以下内容可能会使性能提高2倍

  $sql = "UPDATE table SET `time`= :time WHERE id=:id ";
  $stmt = $pdo->prepare($sql);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);       
  foreach ($array as $k=>$v) {
      try {       
        $prepared = array('time' => (int)$v['time'], 'id' => (int)$v['id']);
          $stmt->execute($prepared);
        } catch(PDOException $e) {
        echo 'Error: ' . $e->getMessage();
      }
    }
  }


但是,请针对您的特定体系结构进行基准测试和验证

@草莓,你是说每个循环更新一次(如我所说),还是说每次更新一次,在这种情况下,你将如何继续进行300000次更新?我是说一次更新。句号。您的
$array
来自哪里?是否来自另一个数据库查询?如果是这样的话,那个查询是什么?一行一行地RBAR。我会选择用这些值加载一个新的工作表(所谓“加载”,我的意思是运行一个加载数据填充,或者至少运行一个多行插入值(1,2)、(1,3)、(1,5),然后我将运行引用目标表和工作表的更新。我可以问一下,如果我们在一个事务中进行所有这些查询,我们的性能会提高吗?@草莓,你是说每个循环更新一次(就像我所说的那样)或者更新应该一次进行一次,在这种情况下,您将如何继续进行300000次更新?我指的是一次更新。期间。您的
$array
来自何处?是来自另一个数据库查询吗?如果是,该查询是什么?RBAR行是一行一行。我会选择加载一个新的工作表和值(通过“加载”)我的意思是通过运行一个加载数据填充,或者至少运行一个多行插入值(1,2)、(1,3)、(1,5),然后我将运行引用目标表和工作表的更新。我可以问一下,如果我们在一个事务中进行所有这些查询,我们的性能会提高吗?@草莓,你是说每个循环更新一次(就像我所说的那样)或者一次更新一次,在这种情况下,您将如何继续进行300000次更新?我指的是一次更新。周期。您的
$array
来自哪里?是f吗