我有一个包含大约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 );
答案 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);