【问题标题】:Prepared statement when only read只读时准备好的语句
【发布时间】:2018-01-16 18:17:01
【问题描述】:

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

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

如果没有像这样的预处理语句,使用 MySQLi 会更好吗

$sql = "SELECT * FROM countries ORDER BY name";

【问题讨论】:

  • 如果没有用户提供的变量(要绑定)然后没有 - 只需使用query
  • 如果没有用户输入我不会介意
  • 准备语句仅在将查询存储在数据库引擎中以更快地重复查询时才真正有用。由于您既不这样做也不使用参数化查询(存储查询并单独提交数据的地方),没有理由先准备查询。做一个普通的$db->query('select...')

标签: php mysqli


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    准备好的陈述

    直接回答你的问题,不。在许多语言中,由于该库的方法签名,准备好的语句库甚至无法处理这样的查询。我将介绍准备语句和数据库管理系统的背景,因为它们对于理解准备语句产生的效率都是必不可少的。

    查询和数据库的

    在任何数据库管理系统中执行语句时,都会触发步骤的执行。在非常高的级别上,数据库管理系统会执行以下操作。

    1. DBMS 收到查询
    2. SQL 被解释
    3. 查询解析
    4. 查询优化
    5. 返回结果集

    准备好的报表和数据库

    准备好的语句类似于向数据库管理系统发出的任何其他 SQL 查询,但有一些注意事项。

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

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

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

    到目前为止,对于准备好的语句和常规语句,此过程基本相同。

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

    优化

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2016-03-23
      • 2015-06-27
      • 2011-09-16
      相关资源
      最近更新 更多