Mysql PDO绑定值与插入
除了在PDO中使用bind value时转义value的优点外,在使用多个值的bind value(准备一次语句,但使用不同的值执行多次)而不是像这样的单个insert语句时,在性能上是否有任何差异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
在表中插入名称值(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()代码>对于事务处理,速度的提高可能非常显著。。