mysql - 多次准备语句时的性能问题

标签 mysql sql performance postgresql prepared-statement

我有一个 PHP 应用程序,它在 PostgreSQL 和 MySQL 中使用带有准备好的语句的 PDO,我想知道每次在执行之前准备完全相同的语句是否会对性能造成影响。

在伪代码中,示例如下:

for ($x=0; $x<100; $x++) {
    $obj = PDO::prepare("SELECT x,y,z FROM table1 WHERE x=:param1 AND y=:param2");
    $obj->execute(array('param1'=>$param1, 'param2'=>$param2));
}

与准备一次并执行多次不同:

$obj = PDO::prepare("SELECT x,y,z FROM table1 WHERE x=:param1 AND y=:param2");
for ($x=0; $x<100; $x++) {
    $obj->execute(array('param1'=>$param1, 'param2'=>$param2));
}

我多次搜索过这个问题,但似乎在 PHP、PostgreSQL、MySQL 中都找不到对此问题的引用。

最佳答案

是的,它在某种程度上违背了使用准备好的语句的目的。准备允许数据库预先解析查询并为执行做好准备。当您执行该语句时,数据库只需插入您提供的值并执行最后几个步骤。

当您在这样的循环中进行准备时,所有准备工作都会被丢弃并每次重新完成。你应该拥有的是:

$obj = PDO::prepare("SELECT x,y,z FROM table1 WHERE x=:param1 AND y=:param2");
for ($x=0; $x<100; $x++) {
    $obj->execute(array('param1'=>$param1, 'param2'=>$param2));
}

准备一次,执行多次。

关于mysql - 多次准备语句时的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18963570/

相关文章:

php - 按名称 asc 排序时获取表中一行的位置

Php 文件离线连接到本地 SQL 文件。

mysql - 如何优化我的 mysql 查询?

sql - 如何在 SQL 中为添加的行添加具有自动增量值的列?

java - 准备语句对 SQL 注入(inject)的影响

c# - 大量不必要的变量会导致 C# 中的性能问题吗?

php - 批量插入包含俄语的字符串

mysql - 仅当字段为空时设置唯一约束

javascript - 如何将过期 header 添加到 Meteor 静态 Assets

performance - MongoDB的奇怪插入时间