2011-03-07 63 views
1

我想优化一些SQL,只需要一个意见,我应该这样做,还是保持原样,以及为什么我应该这样做。 SQL查询通过PHP & Java执行,我将在PHP中展示一个示例,它将介绍我在做什么。SQL优化

主要问题是:

-Maintainability。

改变表,而不用与所有的遗留代码

SQL的 - 速度(它是一个关注580)为我现在所拥有的

-Readability

例搞乱-Ease :

我拿一个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 +项目)

在此先感谢。

回答

2

您将得到明确答案的唯一方法是运行这两种方法并对其进行配置以查看它们需要多长时间。有了这个说法,我相信用一百个名称值对运行一条UPDATE声明将比运行100 UPDATE声明更快。

+0

你的意思是'值得'!造成很大的差异,哈哈;) – 2011-03-07 11:44:18

+0

哈哈..是的,这就是我的意思打字...有一个星期五至星期一晚上:P现在删除:P – Sigtran 2011-03-07 11:47:06

+0

感谢您的贡献。我认为我会重写他们只是为了安全起见,不要让服务器过载。 – Sigtran 2011-03-07 11:49:33

2

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

使用一个MySQL封装类,当给定一个name => value对的数组时,将返回一个SQL UPDATE语句。它非常简单。我只是寻找我们现在使用的一个...

我们使用something like this(需要注册),但适应一点点,以适应我们的需求。真的很基本但非常非常方便。

例如,更新方法是眼前这个

/** 
* 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; 
} 
+0

谢谢,我之前正在研究封装(对GPL一次不感兴趣),我发现自己更容易编写自定义语句,而不是寻找这些封装中的函数。 – Sigtran 2011-03-07 11:38:29

1

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

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

当然,我确定你有用户名列的索引,但只是提及它 - 你需要这样的索引。