除了在PDO中使用绑定值时转义值的优点,当使用具有多个值的绑定值(准备语句一次,但是使用不同的值执行多次)而不是像单个插入语句那样,性能是否有任何差异
INSERT INTO table_name VALUES (value1, value2, value3),(value1, value2, value3),(value1, value2, value3)
答案 0 :(得分:2)
我自己测试了100,000条记录。对于更简单的场景,我没有使用INSERT INTO而是使用REPLACE INTO来避免每次都出现新的密钥。
在100,000行上的3列示例REPLACE INTO table_name VALUES (value1, value2, value3),(value1, value2, value3),(value1, value2, value3)......
的原始替换为 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();
}
在准备之前创建一个长语句,绑定所有参数并执行一次需要 22秒
REPLACE INTO clientSettings(clientId, settingName, settingValue) VALUES (:a1,:b1,:c1)
(:a2,:b2,:c2)
(:a3,:b3,:c3)
(:a4,:b4,:c4)
.......
请注意,这些是粗略的数字,用于创建100,000条记录的REPLACE INTO(删除和插入的字段)。
答案 1 :(得分:0)
如果你使用预准备语句,它会更快(对于MySQL)。这样,实际的SQL被解析一次并且数据被多次发送 - 因此每次要执行特定插入时都不会调用用于转换INSERT INTO ...的实际SQL层,它只被解析一次然后你只需发送要插入的不同参数(不同的数据)(或执行任何其他操作)。
因此,它不仅可以减少开销,还可以提高安全性(如果使用PDO :: bindValue / param,则由于正在使用的驱动程序/字符集进行适当的转义)。
简而言之 - 是的,您的插页会更快更安全。但是以什么边际 - 很难说。