SQL优化

时间:2011-03-07 11:18:28

标签: sql optimization

我想优化一些SQL,只是需要一个关于我是应该这样做还是留下它的意见以及为什么我应该这样做。 SQL查询通过PHP& amp; Java,我将在PHP中展示一个示例,它将了解我在做什么。

主要关注点是:

-Maintainability。

- 易于更改表而不会弄乱所有遗留代码

-Speed of SQL(关注点???)

-Readability

我现在拥有的例子:

我从客户那里拿了一个 LONG 数组(不幸的是让它变小了)并用以下方式用客户提供的新值更新现有值:

$i = 0;
foreach($values as $value)
{
$sql = "UPDATE $someTable SET someItem$i = '$value' WHERE username='$username'";
mysql_query($sql, $con);
$i+=1;
}

从上面的例子很容易看出,如果值数组很长,那么我执行很多SQL语句。

我应该做一些类似的事情:

$i = 0;
$j = count($values);
$sql = "UPDATE $someTable SET ";
foreach($values as $value)
{
    if($i < $j) //append values to the sql string up to the last item 
    {
    $sql .= "someItem$i = '$value', ";
    }
$i+=1;
}
$sql .= "someItem$i = '$value' WHERE username='$username'"; //add the last item and finish the statement
mysql_query($sql, $con); //execute query once

或者应该以哪种方式完成/我是否应该费心做出这些改变? (有很多类型,他们都有100多个项目)

提前致谢。

3 个答案:

答案 0 :(得分:2)

获得明确答案的唯一方法是运行这两种方法并对其进行分析以查看它们需要多长时间。话虽如此,我相信运行一个具有一百个名称值对的UPDATE语句将比运行100个UPDATE语句更快。

答案 1 :(得分:2)

不要运行100个单独的UPDATE语句!

使用MySQL包装类,当给出name =&gt;的数组时值对将返回SQL UPDATE语句。它真的很简单。我只是在寻找我们现在使用的那个......

我们使用something like this(需要注册),但需要更多调整以满足我们的需求。非常基本,但非常方便。

例如,Update方法就是这个

/** 
 * Generate SQL Update Query 
 * @param string $table Target table name 
 * @param array $data SQL Data  (ColumnName => ColumnValue) 
 * @param string $cond SQL Condition 
 * @return string 
 **/ 
function update($table,$data,$cond='') 
{ 
    $sql = "UPDATE $table SET "; 
    if (is_string($data)) { 
        $sql .= $data; 
    } else { 
        foreach ($data as $k => $v) { 
            $sql .= "`" . $k . "`" . " = " . SQL::quote($v) . ","; 
        } 
        $sql = SQL::trim($sql , ','); 
    } 
    if ($cond != '') $sql .= " WHERE $cond"; 
    $sql .= ";"; 
    return $sql; 
} 

答案 2 :(得分:1)

如果您无法更改代码,请确保它包含在事务中(如果存储引擎是InnoDB),因此在提交事务之前不会更新非唯一索引(这将加快写入速度)和新的行不会刷新到磁盘。

如果这是MyISAM表,请在循环前使用UPDATE LOW_PRIORTY或锁定表,并在读取后解锁。

当然,我确定你在用户名栏上有索引,但只是提一下 - 你需要这样的索引。