我需要能够一次从表单请求中插入 10'000 + 类似的行。目前,我已经用一个循环 10'000 次的单行准备语句完成了它,我在其中重新绑定了每个 var。
for ($i=0; $i < intval($cloneCount); $i++)
{
... 9 other bindParam
$insertG->bindParam(':v1', $v1, PDO::PARAM_STR);
$insertG->bindParam(':v2', $v2, PDO::PARAM_INT);
$insertG->execute();
}
这需要将近 30 秒才能实现,这当然不是一个好的做法。今天是 10,000,但明天可能是 100,000。
如果我在一个查询中插入多行,(v1,v2),(v1,v2)...
我需要将每个值绑定到一个新参数,因此我相信我需要在一个查询中拥有近 100'000 个 bindedParam。如果它是 UTF-8 并且我计算每个字符大约 2 个字节(我知道它最多可以 4 个),我的查询将在 10 到 20 MB 左右,并且 mysql 服务器在另一台机器上。说到这里,我很惊讶我设计糟糕的请求只用了 30 秒就成功了。
有没有办法只发送一行并告诉 mysql 服务器复制最后一行 10'000 次?
编辑部分解决方案
遵循 Bill Karwin 和 Zsolt Szilagy 的建议。通过以下调整,我设法将 10'000 插入到远程 mysql 服务器的时间缩短到 5-6 秒:
$dataBase->beginTransaction();
$insertG = $dataBase->prepare('INSERT INTO G...)
...
10 * bindParam of all kinds
for ($i=0; $i < 10000; ++$i)
{
$hashKey = sha1(uniqid().$i); //$hashKey is a binded param
$insertG->execute();
}
$dataBase->commit();