只读时准备好的声明

时间:2018-01-16 18:17:02

标签: php mysqli

当您只想选择表中的所有行时,是否有必要使用预准备语句?如果在查询中使用WHERE name = ?,则无法绑定比较。

$stmt->prepare("SELECT * FROM countries ORDER BY name");

使用没有预备语句的MySQLi(如

)是否更好
$sql = "SELECT * FROM countries ORDER BY name";

2 个答案:

答案 0 :(得分:0)

当您使用参数动态生成查询时,预准备语句优于纯SQL查询。在您的示例中,您的SQL不包含任何变量,因此使用普通查询或预准备语句在功能上是等效的。

答案 1 :(得分:0)

准备好的陈述

直接回答你的问题,没有。并且在许多语言中,由于该库的方法签名,准备好的语句库甚至不能使用类似的查询。我将介绍准备语句和数据库管理系统,因为它们对于理解预准备语句所产生的效率至关重要。

查询和数据库

在任何数据库管理系统中执行语句时,都会触发执行步骤。在很高的层次上,数据库管理系统会做以下事情。

  1. DBMS收到查询
  2. SQL被解释
  3. 查询解析
  4. 查询优化
  5. 返回结果集
  6. 准备好的语句和数据库

    准备好的语句类似于发布到数据库管理系统的任何其他SQL查询,除了一些警告。

    首先,准备好的语句模板(没有参数值)从应用程序发送到数据库管理系统。解释SQL之后,数据库系统开始查询解析和查询优化,验证语法和语义,并分别开始查找最佳查询计划的过程。

    查询计划是一组用于运行提供的查询的执行。在大多数情况下,查询可以有多个查询平面。选择最有效的飞机是数据库管理系统的一部分。

    查询优化器继续生成各种查询计划,然后分配成本和值。

    到目前为止,这个过程对于准备好的陈述和常规陈述大致相同。

    因此,要理解为什么你的查询不会从预备语句中受益(除了准备好的语句被定义为必须具有参数这一事实)之外,让我们仔细研究一下准备好的语句优化。

    优化

    我们之前一直在查询优化器从查询计划列表中选择最有效的查询计划。但是,我们没有讨论它是如何实际做到这一点的。对于非参数语句,优化程序为每个计划分配标量成本值。

    但是,对于参数查询,优化器将每个查询工厂分别关联到将多维参数空间映射到成本空间的函数。基本来获得任何给定输入的所有最佳查询。

    这是一个代价高昂的过程,但是在连续运行中非常快,因为答案是已知的而不是计算。 。