提问人:Drew 提问时间:11/3/2018 最后编辑:Drew 更新时间:11/5/2018 访问量:179
如何在 php 中将插入质量值与预准备语句结合起来
How do you combine inserting mass values with prepared statements in php
问:
在下面提出的旧问题中,顶部答案描述了如何加快MySQL插入过程。由于这是一个老问题,我很好奇如何使用准备好的语句来做到这一点。我将MySQL与innoDB一起使用。我将在此处为不想检查链接的人粘贴答案中的示例。
在这里,我将介绍 3 种插入数据的方法,从慢到 快:
如果要插入许多行,则以下操作速度非常慢:
INSERT INTO mytable (id,name) VALUES (1,'Wouter'); INSERT INTO mytable (id,name) VALUES (2,'Wouter'); INSERT INTO mytable (id,name) VALUES (3,'Wouter');
这已经快了很多:
INSERT INTO mytable (id, name) VALUES (1, 'Wouter'), (2, 'Wouter'), (3, 'Wouter');
这通常是最快的:
具有如下所示的 CSV 文件:
1,Wouter 2,Wouter 3,Wouter
然后运行类似
LOAD DATA FROM INFILE 'c:/temp.csv' INTO TABLE mytable
这显然是一个古老的答案。我想知道如何以尽可能快的方式使用准备好的语句来做到这一点,但让我们一步一步来。首先,我想知道如何使用准备好的语句来做到这一点。任何可以举出的例子将不胜感激。我将用您可能需要的任何额外信息回复或编辑这个问题。
我正在使用 mysqli_ *Edited for Rick James 的问题。
我将尽我所能,并就如何做到这一点做出有根据的猜测。如果我错了,请纠正我。
我想我可以转换
INSERT INTO mytable (id, name) VALUES
(1, 'Wouter'),
(2, 'Wouter'),
(3, 'Wouter');
到
$bindParamsToBuild = '($myArray[key], ?,?),'
for (i = 0; i < count($myArray); i++)
{
if (i === count($myArray))
{
$bindParamsToBuild += '($myArray[key], ?,?);';
}
else
{
$bindParamsToBuild += '($myArray[key], ?,?),';
}
}
"INSERT INTO mytable (id, name) VALUES".$bindParamsToBuild;
答:
您使用的是 PDO 还是 mysqli?
如果使用 mysqli,请分别对列表中的每个项目使用。这有点乏味,但可以通过逐步构建插入字符串来简化。我建议不要将超过 100 个项目放入一个 .real_escape_string()
INSERT
https://stackoverflow.com/a/780046/1766831 对细节的讨论非常好。(但一定要使用 ,而不是 。mysqli_*
mysql_*
计划 A:按照其中一些链接中的讨论构造查询。使用 和 PHP 字符串操作,而不是“prepare”。real_escape_string
计划 B:构建一个有很多问号的字符串。同时,使用要放入这些问号的值构建一个数组。然后执行单个“准备”以完成多行语句。INSERT
评论
LOAD DATA FROM
microtime()