gpt4 book ai didi

php - SQL - 执行更新的最快方法

转载 作者:行者123 更新时间:2023-11-29 23:48:05 25 4
gpt4 key购买 nike

我在 PHP/MySQL 中创建了一个小程序来更新数据库中的表,我想知道在 UPDATE 语句中引入条件会如何改变其性能。

现在,我正在对表的每条记录执行 UPDATE,忽略我要更新的字段已经被计算和更新的事实:

mysql_query("UPDATE matches SET delta=".$delta." WHERE id=".$idp."");

其中 $delta 是之前计算的 PHP 变量,id 是表的唯一键。

插入条件以确定增量字段是否已在表中计算/更新,或者是否仍设置为 0(其默认值),在执行速度方面是否有任何差异?

mysql_query("UPDATE matches SET delta=".$delta." WHERE id=".$idp." and delta=0");

添加delta=0条件有什么改进吗?

总结一下我的问题:当由于 delta=0 条件为 false 而未执行表上的写入操作时,UPDATE 是否会更快?我的表有大约 10k 条记录。

提前致谢,请原谅我糟糕的英语! ;-)安德里亚

最佳答案

如果您要执行这样的多次更新,那么通常我建议您改为执行 INSERT,但使用重复键条件在 id 已存在时执行更新。这样,您就可以执行单个 SQL 查询,而不是对表中的每条记录执行一个查询。

mysql_query("INSERT INTO matches (id, delta)
VALUES
($idp1, $delta1),
($idp2, $delta2),
($idp3, $delta3),
($idp4, $delta4)
ON DUPLICATE KEY UPDATE delta=VALUES(delta)
");

编辑

这是我在进行多次插入/更新时有时会使用的 php 类(这里是稍微简化的版本)

<?php

class table_process
{

var $link;
var $row_array = array();
var $field_name_store = '';
var $table_name = '';
var $record_count = 0;
var $update_clause = '';
var $rows_to_process = 255;

function __CONSTRUCT($link, $table_name, $update_clause = '')
{
$this->link = $link;
$this->table_name = $table_name;
$this->update_clause = $update_clause;
}
function __DESTRUCT()
{
if (count($this->row_array) > 0)
{
$this->process_rows();
}
}
function field_names($in_field_names)
{
$this->field_name_store = "(`".implode("`,`", $in_field_names)."`)";
}
function record_count()
{
return count($this->record_count);
}
function make_row($in_row)
{
$ret = true;
foreach($in_row AS &$in_field)
{
$in_field = (($in_field == null) ? "NULL" : "'".mysql_real_escape_string($in_field, $this->link)."'");
}
$this->record_count++;
$this->row_array[] = "(".implode(",", $in_row).")";
if (count($this->row_array) > $this->rows_to_process)
{
$ret = $this->process_rows();
}
return $ret;
}
function process_rows()
{
$ret = true;
$sql = "INSERT INTO ".$this->table_name." ".$this->field_name_store." VALUES ".implode(",", $this->row_array)." ".$this->update_clause;
if (!mysql_query($sql, $this->link))
{
$ret = false;
}
$this->row_array = array();
return $ret;
}
public function set_rows_to_process($rows_to_process)
{
if (is_numeric($rows_to_process) and intval($rows_to_process) > 0)
{
$this->rows_to_process = $rows_to_process;
}
}
}

?>

然后您将使用如下所示的内容:-

$ProcessMatches = new table_process($link, 'matches', ' ON DUPLICATE KEY UPDATE delta=VALUES(delta)', true);
$ProcessMatches->field_names(array('id', 'delta'));

$ProcessMatches ->make_row(array('id'=>$id1, 'delta'=>$delta1));
$ProcessMatches ->make_row(array('id'=>$id2, 'delta'=>$delta2));
$ProcessMatches ->make_row(array('id'=>$id3, 'delta'=>$delta3));
$ProcessMatches ->make_row(array('id'=>$id4, 'delta'=>$delta4));
$ProcessMatches ->make_row(array('id'=>$id5, 'delta'=>$delta5));
$ProcessMatches ->make_row(array('id'=>$id6, 'delta'=>$delta6));

unset($ProcessMatches);

该类采用连接链接和表名/列名,以及更新子句(如果需要)。

您插入的每一行都由类获取并为插入而构建。一旦有 255 行准备插入,它就会插入它们并删除存储它们的数组。完成后,取消设置触发 __DESTRUCT 方法的对象,该方法执行最终插入。

关于php - SQL - 执行更新的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25805973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com