如何减少循环时间

时间:2018-01-07 17:35:14

标签: php mysql sql performance loops

我有一个包含大约4,000个名字的数据库表。我需要阅读这些内容,循环浏览它们并在另一个表中创建条目,其中包含用户输入的ID和ID。最多可以有20个id。我已经编写了这段代码,但如果在三个小步之后仍在运行,那么我就停止了它。我希望有一种方法可以对其进行编码以缩短时间。它将位于共享服务器上,最长执行时间为60秒,因此不能再花费更长时间。这就是我所拥有的。有人能看到提高速度的方法吗?

    $mysql_query = "select id from main_table";
    $post = array('0' => 1, '1' => 2); //up to 20 entries
    $cnt = count($post);
    $str = '';

    while ($item = mysql_fetch_array($mysql_query)) {
      for ($i = 0; $i < $cnt; ++$i)  {
        $str .= "('" . $item['id'] . "', '" . $post[$i] . "'),";
      }    
    }  
    $str = substr($str, 0 -1);
    mysql_query("insert into next_table values" . $str );

3 个答案:

答案 0 :(得分:3)

这是一个完全不需要PHP循环和字符串连接的解决方案。但是你仍然需要PHP代码(留作练习)来转换它:

$post = array(1, 2, 3);

进入这个:

SELECT 1 AS val UNION ALL
SELECT 2        UNION ALL
SELECT 3

这是您需要执行的一个查询:

INSERT INTO next_table
SELECT main_table.id, userval.val
FROM main_table
JOIN (
    SELECT 1 AS val UNION ALL
    SELECT 2        UNION ALL
    SELECT 3
) AS userval

扰流:

  

$post = array(1, 2, 3);
$sql = array_reduce($post, function($acc, $value){
  $cur = $acc === "" ?
    sprintf("SELECT %d AS val", $value) :
    sprintf("\nUNION ALL SELECT %d", $value);
  return $acc . $cur;
}, "");

答案 1 :(得分:0)

如果你找不到其他解决方案如何减少执行时间,即。任何类型的优化,然后您可以尝试减少一次处理的记录数

在时间执行限制内处理可以处理的id的数量块。

// get the very last inserted record from next_table
// and select reasonable amount of records from main_table to process
$mysql_query = "SELECT id FROM main_table 
WHERE id > (SELECT id FROM next_table MAX(id) LIMIT 1) 
LIMIT 500)"; // change the 500 to whatever

然后多次调用脚本,因为有任何数据等待处理。

答案 2 :(得分:0)

以下是基于Salman A答案的新代码。完成后大约需要3秒钟。优秀。我发布了新代码,以防有人在某些时候需要它。

    $mysql_query = mysql_query("select id from main_table");
    $post = array('0' => 1, '1' => 2); //up to 20 entries
    $cnt = count($post);
    $str = '';

    if ($cnt == 1) {
        $str .= "SELECT " . $post[0] . " AS val ";
    } else {    
        $str .= "SELECT " . $post[0] .  " AS val UNION ALL ";

        for ($i = 1; $i < $cnt; ++$i) {              
            $str .= " SELECT " . $post[$i] . " UNION ALL ";
        }
        $str = substr($str, 0, -11);
    }

    $raw = "INSERT INTO next_table SELECT main_table.id, userval.val
      FROM main_table JOIN ( " . $str . " ) AS userval ";             

    mysql_query($raw);