释放PDO准备的语句(DEALLOCATE PREPARE)
PDO准备好的陈述应该在使用后释放出来吗? 如果是这样,怎么样? 具体来说,我正在询问关于MySQL的内容 - 你应该怎样,并且应该通过PDO调用DEALLOCATE PREPARE
。 (编辑:为了澄清,这个问题不是指模拟的准备,而是真正的准备。)
另外 - 这将释放结果集(当大)?
说明:
我已经看到了代码
$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;
这导致我想知道这是什么,何时以及如果unset($stmnt);
会不一样?
手册指出
当准备查询时,数据库将分析,编译和优化其执行查询的计划。 [...]通过使用准备好的语句,应用程序避免重复分析/编译/优化循环。
这往往表明你应该不分配该语句,并且MySQL有能力。 所以,
DEALLOCATE PREPARE
,以及如何 为了完整起见,另一个针对mysqli_()
提及“free_result”和“close”函数的SO问题表明,释放语句实际上会增加时间(除非您的内存使用量很大并且需要空间)。 但是“free_result”与释放SQL服务器使缓存准备好的语句不同。
PDO准备好的陈述应该在使用后释放出来吗? 如果是这样,怎么样?
在MySQL的上下文中? 没有为什么?
PDO默认模拟预准备语句。 这意味着PDO本身会执行参数替换,转义等操作,并将SQL的块发送到队列中,而不是使用本机预处理语句。
虽然可以打开它,但除非使用未缓冲的查询,否则不需要明确关闭句柄。 仅仅让语句句柄超出范围或将其设置为null将不会关闭游标。 同样,这只在你使用未缓冲的查询时才重要。 如果你不是,那么让它超出范围或将其设置为空就足以完全关闭手柄。
您还链接到DEALLOCATE PREPARE
。 只有在用SQL字符串手动调用PREPARE
时才需要该语法。 这是一个完全独立的操作,而不是基于MySQL C级API的预准备语句,这正是PDO_MYSQL
正在使用的语句。 (好吧,也许你正在使用mysqlnd
,但它实际上是一回事。)
是。 当您完成准备语句时,您可以将其设置为NULL
或使用unset()
。
对于具有多个查询和大型数据库的脚本,这会有所不同。 你可以测试:
$before = memory_get_usage();
$stmt = NULL;
die(memory_get_usage() - before);
对我来说,这节省了20MB的内存,稍后会使脚本崩溃。
链接地址: http://www.djcxy.com/p/66705.html上一篇: Freeing up PDO prepared statements (DEALLOCATE PREPARE)