准备好的声明只准备一次?

时间:2012-12-28 11:08:07

标签: php mysql performance pdo prepared-statement

连接数据库:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass,
               array(PDO::ATTR_PERSISTENT => true));

准备声明:

$stmt = $db->prepare('SELECT * FROM foo',
                     array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));

语句SELECT * FROM foo是否只准备一次,然后存储在MySQL服务器上,以便后续调用PHP脚本?或者每次调用PHP脚本时都重新准备好了吗?

2 个答案:

答案 0 :(得分:4)

不幸的是答案是无关紧要的。

即使准备好的语句在持久连接的整个生命周期中仍然准备好,一旦当前脚本结束,PHP就无法引用它。鉴于语句句柄最终无论如何都会超出范围,很可能,即使语句可能持续存在,它可能也不会。这是猜测,但PDO很可能在此之后清理。

真正的问题是PDO, by default, emulates prepared statements。也就是说,它实现了本地转义和占位符的替换。这意味着服务器永远不会看到真实的准备,绑定和执行。如果你想使用真正的准备,请关闭仿真。

答案 1 :(得分:1)

虽然您可以欺骗PHP在单个持久连接中使用“文本”预处理语句而不是“二进制”语句之间保留准备好的语句并将其他黑客联系起来,但这需要付出太多努力,但收入几乎不可察觉。

无论如何,对于表演而言,它是无关紧要的。如果您在真正需要加速查询,请考虑使用HandlerSocket,这可以大大提高某些查询的速度。