首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -最快的更新方式

SQL -最快的更新方式
EN

Stack Overflow用户
提问于 2014-09-12 10:17:04
回答 1查看 164关注 0票数 0

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

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

代码语言:javascript
复制
mysql_query("UPDATE matches SET delta=".$delta." WHERE id=".$idp."");

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

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

代码语言:javascript
复制
mysql_query("UPDATE matches SET delta=".$delta." WHERE id=".$idp." and delta=0");

是否有任何改进添加delta=0条件?

总结我的问题:当表上的写操作由于delta=0条件为false而没有执行时,更新会更快吗?我的桌子上有大约一万张唱片。

事先谢谢,原谅我英语不好!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-12 10:38:06

如果您正在执行像这样的多个更新,那么通常我建议执行一个INSERT,但是在id已经存在时,使用一个重复的键条件来执行更新。这样,您可能对表上的每个记录执行单个SQL查询,而不是一个查询。

代码语言:javascript
复制
mysql_query("INSERT INTO matches (id, delta)
VALUES
($idp1, $delta1),
($idp2, $delta2),
($idp3, $delta3),
($idp4, $delta4)
ON DUPLICATE KEY UPDATE delta=VALUES(delta)
");

编辑

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

代码语言:javascript
复制
<?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;
        }
    }
}

?>

然后,您将使用以下内容:-

代码语言:javascript
复制
$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方法的对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25805973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档