我在PHP/MySQL中创建了一个小程序来更新数据库中的表,我想知道它的性能将如何改变,在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而没有执行时,更新会更快吗?我的桌子上有大约一万张唱片。
事先谢谢,原谅我英语不好!
发布于 2014-09-12 10:38:06
如果您正在执行像这样的多个更新,那么通常我建议执行一个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);类接受连接链接和表名/列名,以及一个update子句(如果需要的话)。
您插入的每一行都由类获取并为插入构建。一旦有255行准备插入,然后插入它们并擦除存储它们的数组。完成之后,取消触发执行最后插入的__DESTRUCT方法的对象。
https://stackoverflow.com/questions/25805973
复制相似问题