MySQL准备的语句与普通查询相比.收益&;损失


MySQL prepared statement vs normal query. Gains & Losses

我正在更新/重新处理一些数据库代码,我想知道使用准备好的语句到底应该有什么东西。

举个例子代码:

$values = '';
for ($i = 0; $i < $count; $i++) {
    $name = mysql_real_escape_string ($list[$i][1]);
    $voc = mysql_real_escape_string ($list[$i][3]);
    $lev = $list[$it][2];
    $lev = is_numeric ($lev)? $lev : 0;
    $values .= ($values == '')? "('$name', '$voc', $lev)" : ", ('$name', '$voc', $lev)";
}
if ($values != '') {
    $core->query ("INSERT INTO onlineCList (name, voc, lev) VALUES $values;");
}

现在,除了可读性(健全性)的明显提高以及max_packet_size不再是一个问题之外,当我重新编码为使用准备好的语句时,我是否应该期望性能发生任何变化?我正在远程连接MySQL服务器,我担心发送多个小数据包会比发送一个大数据包慢得多。如果是这种情况,MySQLi/mysqlnd是否可以缓存这些数据包?

另一个例子:

$names = '';
while ($row = mysql_fetch_array ($result, MYSQL_ASSOC)) {
    $name = mysql_real_escape_string($row['name']);
    $names .= ($names == '') ? "'$name'" : ", '$name'";
}
if ($names != '') {
    $core->query ("UPDATE onlineActivity SET online = NULL WHERE name IN ($names) AND online = 1;");
}

如上所述,我是否应该预料到意外,在重新编码后使用准备好的语句?如果MySQL服务器必须运行一个带有大IN子句的查询,或者运行多个带有相等性检查(.. WHERE name = $name AND ..)的准备好的查询,这对MySQL服务器有什么不同吗?

假设所有内容都已正确编制索引。

通常,如果您只使用一个准备好的语句来代替普通查询,则速度会稍微慢一些,因为查询是分两步准备和执行的,而不是一步。只有在准备语句并多次执行时,准备好的语句才会变得更快。

但是,在本例中,您使用的是mysql_real_escape_string,它对数据库执行往返操作。更糟糕的是,您在循环中执行它,因此,每个查询执行多次。因此,在这种情况下,用一个事先准备好的声明来代替所有这些圆桌会议就是双赢。

关于最后一个问题,没有理由不能像通过普通查询解析器那样,在准备好的语句中使用相同的查询(即,没有理由执行一个带有IN的版本,另一个带有一堆OR的版本)。准备好的语句可以有IN (?, ?, ?),然后只需绑定该数量的参数即可。

我的建议是始终使用事先准备好的陈述。在它们增加了边际性能开销的情况下,出于安全性(无SQL注入)和可读性的好处,它们仍然是值得的。当然,任何时候你发现自己求助于mysql_real_escape_string,你都应该使用一个预先准备好的语句。(对于不需要转义变量输入的简单一次性查询,它们不是绝对必要的。)

  1. 事先准备好的陈述更安全
  2. 准备好的报表具有更好的性能
  3. 事先准备好的陈述更便于书写

你会阅读所有这些吗!!

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

试试这个

准备语句与存储过程