Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql PDO绑定值与插入_Mysql_Sql_Insert_Pdo_Crud - Fatal编程技术网

Mysql PDO绑定值与插入

Mysql PDO绑定值与插入,mysql,sql,insert,pdo,crud,Mysql,Sql,Insert,Pdo,Crud,除了在PDO中使用bind value时转义value的优点外,在使用多个值的bind value(准备一次语句,但使用不同的值执行多次)而不是像这样的单个insert语句时,在性能上是否有任何差异 在表中插入名称值(value1,value2,value3),(value1,value2,value3),(value1,value2,value3)如果使用预先准备好的语句,速度会更快(对于MySQL)。这样,实际的SQL将被解析一次,数据将被发送多次-因此,用于将INSERT转换为的实际SQL

除了在PDO中使用bind value时转义value的优点外,在使用多个值的bind value(准备一次语句,但使用不同的值执行多次)而不是像这样的单个insert语句时,在性能上是否有任何差异
在表中插入名称值(value1,value2,value3),(value1,value2,value3),(value1,value2,value3)
如果使用预先准备好的语句,速度会更快(对于MySQL)。这样,实际的SQL将被解析一次,数据将被发送多次-因此,用于将INSERT转换为的实际SQL层。。。不是每次要执行特定插入时都调用,它只解析一次,然后只发送要插入(或执行任何其他操作)的不同参数(不同数据)

因此,它不仅减少了开销,而且还提高了安全性(如果您使用PDO::bindValue/param,这是因为根据所使用的驱动程序/字符集进行了正确的转义)


简言之,是的,您的插入将更快更安全。但差距有多大?很难说。

我自己对100000张唱片做了一些测试。对于一个更简单的场景,我没有使用INSERT INTO,而是使用REPLACE INTO,以避免每次都需要使用新键

替换成 原始替换为3列示例
replace into table_name value(value1,value2,value3),(value1,value2,value3),(value1,value2,value3)…
在100000行上大约花费了14秒

正常绑定 使用准备语句、绑定值和执行准备好的语句大约花费了33秒

foreach ($vars as $var) {
    $stmt->bindValue(':a' . $var["value1"], $var["value2"]);
    $stmt->bindValue(':b' . $var["value3"], $var["value4"]);
    $stmt->bindValue(':c' . $var["value5"], $var["value6"]);
    $stmt->execute();
}
REPLACE INTO clientSettings(clientId, settingName, settingValue) VALUES (:a1,:b1,:c1)
(:a2,:b2,:c2)
(:a3,:b3,:c3)
(:a4,:b4,:c4)
.......
绑定但执行一次 在准备之前创建一个长语句,绑定所有参数并执行一次大约花费了22秒

foreach ($vars as $var) {
    $stmt->bindValue(':a' . $var["value1"], $var["value2"]);
    $stmt->bindValue(':b' . $var["value3"], $var["value4"]);
    $stmt->bindValue(':c' . $var["value5"], $var["value6"]);
    $stmt->execute();
}
REPLACE INTO clientSettings(clientId, settingName, settingValue) VALUES (:a1,:b1,:c1)
(:a2,:b2,:c2)
(:a3,:b3,:c3)
(:a4,:b4,:c4)
.......

请注意,这些都是粗略的数字,用于在100000条记录上创建REPLACE-INTO(其中删除和插入的字段)。

不要忘记,准备语句的另一个目的是使查询安全。您是否将普通绑定放在事务中?e、 g.
$db_conn->beginTransaction();foreach..}$db_conn->commit()对于事务处理,速度的提高可能非常显著。。