如何在 php 中将插入质量值与预准备语句结合起来

How do you combine inserting mass values with prepared statements in php

提问人:Drew 提问时间:11/3/2018 最后编辑:Drew 更新时间:11/5/2018 访问量:179

问:

在下面提出的旧问题中,顶部答案描述了如何加快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;
php mysql 预备语句 服务器端 web-development-server

评论

2赞 mario 11/3/2018
“越快越好”仍然是方法。LOAD DATA FROM
1赞 mario 11/3/2018
通过 php 数组将多行插入 mysql 的可能重复(第 3 个答案),批量参数化插入,将数据插入数据库的最有效方法?预处理语句、大容量加载还是多个插入语句?、PDO 预处理 在单个查询中插入多行
0赞 Deadooshka 11/4/2018
你可以用 PHP 的microtime()
0赞 Drew 11/4/2018
你们错过了重点,因为我正试图弄清楚如何将其放入准备好的声明中。请举个例子,说明在准备好的语句中如何做到这一点。

答:

0赞 Rick James 11/4/2018 #1

您使用的是 PDO 还是 mysqli?

如果使用 mysqli,请分别对列表中的每个项目使用。这有点乏味,但可以通过逐步构建插入字符串来简化。我建议不要将超过 100 个项目放入一个 .real_escape_string()INSERT

https://stackoverflow.com/a/780046/1766831 对细节的讨论非常好。(但一定要使用 ,而不是 。mysqli_*mysql_*

计划 A:按照其中一些链接中的讨论构造查询。使用 和 PHP 字符串操作,而不是“prepare”。real_escape_string

计划 B:构建一个有很多问号的字符串。同时,使用要放入这些问号的值构建一个数组。然后执行单个“准备”以完成多行语句。INSERT

评论

0赞 Drew 11/4/2018
我正在使用mysqli_但是您没有解释如何像我上面问的那样将其放入准备好的陈述中。