Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql-PDO准备语句效率_Php_Mysql_Pdo_Prepared Statement - Fatal编程技术网

Php Mysql-PDO准备语句效率

Php Mysql-PDO准备语句效率,php,mysql,pdo,prepared-statement,Php,Mysql,Pdo,Prepared Statement,我正在接管一个PHP应用程序,它在每次运行SQL语句时都使用MySQL PDO准备的语句。 我知道,当您准备对同一条语句进行多次迭代时,准备SQL的效率会更高 $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->execute(array(150, 'red')); $red = $sth->fetchAll();

我正在接管一个PHP应用程序,它在每次运行SQL语句时都使用MySQL PDO准备的语句。 我知道,当您准备对同一条语句进行多次迭代时,准备SQL的效率会更高

$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->execute(array(150, 'red'));
$red = $sth->fetchAll();
$sth->execute(array(175, 'yellow'));
$yellow = $sth->fetchAll();
如果应用程序执行了成百上千条“在重复密钥更新时插入到……中”SQL语句,$DB->prepare()步骤是否会在每次运行时产生大量开销


非常感谢,Jason。

如果内存可用,MySQL会看到您准备好的语句,并希望您运行的应用程序可能会多次调用同一语句。因此,它缓存语句字符串,因此再次准备语句字符串不会带来太多开销,尽管这不仅仅是将对语句的引用保留在内存中。这肯定比每次从一个字符串解析一个全新的查询要好


不过,这只是我模糊的记忆中听到的。重要的一点是:如果这些成百上千个插件在同一个请求中运行,请考虑重构数据库类以准备一次并在这样的情况下执行多次。要知道它将带来多大的不同,唯一的方法是自己对其进行基准测试:/

来自文档:

调用PDO::prepare()和 语句的PDOStatement::execute() 这将被多次发布 具有不同的参数值 优化服务器的性能 通过允许驾驶员 协商客户端和/或服务器端 查询计划和元数据的缓存 信息


我并没有在这里透露什么,但“优化性能”的反面实际上是“开销”。至于它是否重要,为什么不以任何一种方式运行一个循环并进行测量呢?然后,您可以使用硬数据来支持您的决策。

除了查询重用之外,在PDO中使用准备好的语句的主要原因是执行占位符绑定

$query = self::$DB->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$query->execute($bindvars);
在此代码中,
$sql
变量中的问号(或
:named
)占位符将替换为
$bindvars
数组中的值。这种替换可以确保变量被正确引用和转义,这使得执行起来更加困难

在prepare/execute中可能会有少量开销,但考虑到SQL注入的风险,这一小开销算不上什么。唯一的另一种选择是将SQL字符串连接在一起,这可能是一个巨大的安全风险,除非每次都做得非常完美

以前的开发人员知道他或她在做什么,至少在这个特定的案例中是这样,您不应该撤销他或她在这里所做的工作。相反,您应该继续在将来的所有代码中使用准备好的语句


(另一方面,我不能保证MySQL的游标性能…

我想提出的一个好问题是:如果一个人再次准备同一条语句,那么这条语句是否被捕获&是否使用了已经准备好的语句?OP并不是真的问到是否使用PDO——权重应该在“调用多次准备是否有害?”第二部分。@Jon,我的论点是,大量准备好的语句所产生的任何可能的性能影响都被准备好的语句本身的好处所抵消。@Charles:没有人怀疑准备好的语句的好处。这就是准备同一份声明的次数。:)@Jon,我不会从这个问题中得到“多次准备同一个陈述”的东西,除非我误解了有成千上万的
插入到。。。在重复键更新
s上,在这种情况下,我不清楚他是否在谈论许多不同的查询,或者他是否在谈论无法重复使用准备好的语句。如果是后者,那么这肯定是需要解决的问题。我只是不想看到有人降级,仅此而已。:)@Jon—“不管他说的是重复使用准备好的声明的失败。”,是的,这就是这里发生的事情。杰森
$query = self::$DB->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$query->execute($bindvars);