我一直在寻找这个问题的答案,但在任何地方都没有找到。对PDO::prepare()的调用是缓存的,还是我应该自己缓存结果,即如果我做了下面的事
function foo () {
$handle = PDO::prepare(...);
/* do stuff with the handle */
}
字符串
prepare()语句是否会被PDO缓存,以便快速检索第二个、第三个等。还是自己做比较好。
function foo() {
static $handle = null;
if (!$handle) {
$handle = PDO::prepare(...);
}
/* do stuff with the handle */
}
型
4条答案
按热度按时间q9rjltbz1#
有MySQL query cache。但一般来说,您应该明确保留预准备语句的标识符并重用它。
MySQL 8.0版中没有查询缓存,请参见
https://dba.stackexchange.com/questions/217577/why-mysql-remove-query-cache-in-8-0-version的
https://dev.mysql.com/blog-archive/mysql-8-0-retiring-support-for-the-query-cache/的
ycl3bljg2#
两次对
PDO::prepare()
的后续调用(即使使用相同的SQL查询)应该返回两个不同的PDOStatement
(或句柄),以避免冲突,特别是在您可能应用于它的先前绑定和当前绑定之间。用prepare()
创建PDO语句的成本很低。您可能希望缓存的是从同一SQL查询返回的结果,无论是原始的还是由prepare()构建的,这是DBMS(例如MySQL)的功能,而不是PHP。ha5z0ras3#
这取决于您的数据库驱动程序。在MySQL中,PDO默认会创建一个本地的预准备语句。如果要使用实际的查询缓存,可以禁用它。
如果必须重复执行相同的查询,那么是的,您需要保留该句柄。如果您使用的是模拟的预处理语句,那么这根本没有什么区别。
nhn9ugyo4#
前一段时间我尝试做CPDO,它可以作为标准PDO使用