在最上面的答案下面的老问题中,描述了如何加快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_ *针对 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;
答案 0 :(得分:0)
您使用的是PDO还是mysqli?
如果使用mysqli,请在列表中的每个项目上分别使用real_escape_string()
。这有点乏味,但是可以通过逐步构建插入字符串来简化。我建议不要在单个INSERT
中放入超过100个项目。
https://stackoverflow.com/a/780046/1766831是有关细节的很好的讨论。 (但请务必使用mysqli_*
,而不要使用mysql_*
。)
计划A:按照其中一些链接中的讨论构造查询。使用real_escape_string
和PHP字符串操作代替“准备”。
计划B:构建一个带有很多问号的字符串。同时,构建一个包含要放入这些问号的值的数组。然后执行一次“准备”以完成多行INSERT
语句。