在php中如何将插入大量值与准备好的语句结合起来

igsr9ssn  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(417)

在下面的老问题中,最上面的答案描述了如何加快mysql插入过程。因为这是一个老问题,我很好奇如何用准备好的语句做到这一点。我在innodb中使用mysql。我将在这里为不想查看链接的人粘贴一个来自答案的示例。
这里我将介绍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。
我要尽我最大的努力,对如何做到这一点做出有根据的猜测。如果我错了,请纠正我。
我想我可以改变

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;
suzh9iv8

suzh9iv81#

你用的是pdo还是mysqli?
如果使用mysqli,请使用 real_escape_string() 在列表中的每个项目上分别列出。这有点乏味,但可以通过逐步构建insert字符串来简化。我建议不要把超过100个项目放在一个单一的 INSERT .
https://stackoverflow.com/a/780046/1766831 是一个很好的细节讨论(但一定要使用 mysqli_* ,不是 mysql_* .)
计划a:按照其中一些链接中的讨论构造查询。使用 real_escape_string 和php字符串操作,而不是“prepare”。
计划b:用很多问号建立一个字符串。同时,构建一个包含要放入这些问号的值的数组。然后做一个“准备”来完成多行 INSERT 声明。

相关问题