如何减少循环时间

rkttyhzu  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(384)

我有一个大约有4000个名字的数据库表。我需要读入它们,循环浏览它们,并在另一个表中创建条目,其中包含这些名称以及用户输入的id。可能有20个身份证。我已经写了这段代码,但如果在三分钟后仍在运行,所以我停止了它。我希望有一个方法来编码它,以减少时间。它将在一个最大执行时间为60秒的共享服务器上运行,因此所需时间不会超过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 );
ss2ws0br

ss2ws0br1#

如果您找不到其他解决方案来减少执行时间,即任何类型的优化,那么您可以尝试一次减少正在处理的记录数。
在执行时间限制内可以处理的id数量的do块。

// 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

然后调用脚本的次数与等待处理的数据的次数相同。

qgzx9mmu

qgzx9mmu2#

这里有一个完全不需要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;
}, "");
6jjcrrmo

6jjcrrmo3#

这是基于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);

相关问题