Php SQL更新查询是否有最大数量,通过循环进行查询是否合理?
我需要重写一个表中大量记录中的字段 我计划运行一个PHP循环,就像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);
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吗