【问题标题】:PDO Bind Value vs InsertPDO 绑定值与插入
【发布时间】:2011-04-20 11:32:01
【问题描述】:

除了在 PDO 中使用绑定值时转义值的优点之外,在使用具有多个值的绑定值(一次准备语句,但使用不同的值执行多次)而不是像单个插入语句时,性能是否有任何差异 INSERT INTO table_name VALUES (value1, value2, value3),(value1, value2, value3),(value1, value2, value3)

【问题讨论】:

  • 不要忘记准备好的语句的另一个目的是使查询安全。

标签: mysql sql insert pdo crud


【解决方案1】:

我自己对 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();
}

绑定但 1 执行

在准备之前创建一个长语句,绑定所有参数并执行一次大约需要 22 秒

REPLACE INTO clientSettings(clientId, settingName, settingValue) VALUES (:a1,:b1,:c1)
(:a2,:b2,:c2)
(:a3,:b3,:c3)
(:a4,:b4,:c4)
.......

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

【讨论】:

  • 您是否将NORMAL BIND 放入事务?例如$db_conn->beginTransaction(); foreach ..} $db_conn->commit(); 交易速度可能会显着提高..
【解决方案2】:

如果您使用准备好的语句,它会更快(对于 MySQL)。这样,实际的 SQL 被解析一次并且数据被多次发送 - 所以用于转换 INSERT INTO ... 的实际 SQL 层不会在您每次想要执行特定插入时被调用,它只解析一次然后您只需发送您想要插入(或执行任何其他操作)的不同参数(不同数据)。

因此,它不仅减少了开销,还提高了安全性(如果您使用 PDO::bindValue/param,因为基于所使用的驱动程序/字符集进行了适当的转义)。

简而言之 - 是的,您的插入会更快、更安全。但是差多少 - 很难说。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2014-08-12
    • 2016-11-29
    • 2016-09-29
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多