【问题标题】:php vs MySQLi, Which one is faster [closed]php vs MySQLi,哪个更快[关闭]
【发布时间】:2018-08-10 17:19:54
【问题描述】:

我想执行一个查询以从我的数据库中的 1000 行中获取数据。我找到了两种方法来做到这一点。

方法一:

SELECT * FROM user WHERE id=879

我用来保护自己免受 SQL 注入的第二个是:

方法二:

<?php
$q="SELECT * FROM user";
$get_res=$dbconn->query($q);
while($set=$get_res->fetch_assoc()) {
 if($set['id']==879)
   {
      //Some task here
   }
}

那么哪个更快。我知道SQLprepared Statement..但我只是想比较这两种方法..如果Method2中存在任何安全漏洞,那么请解释一下..

【问题讨论】:

  • 方法 2 效率极低。你已经在使用 MySQLi 那么为什么不绑定参数呢?查看stackoverflow.com/a/60496/2191572 的第一个示例
  • 方法 1 会快很多。使用准备好的语句来绑定 ID。应该没问题,因为您已经熟悉准备好的语句,
  • 当然 MySQL 在查询方面会更快......这就是 RDBM 背后的全部目的......

标签: php sql mysqli


【解决方案1】:

如果这只是静态id=879,您可以简单地执行查询。它速度快、性能好,并且可以让 MySQL 为您进行过滤。

方法一:

SELECT * FROM user WHERE id=879

性能最高,如果 879 不是变量,则是您的选择。只需执行查询,返回 1 个结果。

方法二:

$pdo = new PDO($dsn, $user, $pass, $opt);
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([ $_POST['user_id'] ]);
$user = $stmt->fetch();

此方法使用 PDO(或者您可以使用 MySQLi 包中提供的bind_param)。从数据库返回 1 个结果,并将变量安全地绑定到查询字符串以执行。这可能是您最好的解决方案,因为它让 MySQL 进行过滤(使用索引和最有效的方法来查找您的结果)。

方法3(不要使用):

<?php
$q="SELECT * FROM user";
$get_res=$dbconn->query($q);
while($set=$get_res->fetch_assoc()) {
 if($set['id']==879)
   {
      //Some task here
   }
}

太可怕了!您正在从数据库返回每个结果,并导致许多不必要的循环来获取您想要的数据。让数据库做过滤,这就是它的设计目的!

【讨论】:

    【解决方案2】:

    第一种(SQL)方法更快。

    原因:SQL 设计用于非常快速地过滤行(使用 id)。因此,它首先搜索所有索引并返回一个匹配的结果。

    尽管如此,使用 PHP 这在逻辑上是相同的,但 PHP 必须首先获取完整的行,验证 id,如果不匹配则继续下一行。

    【讨论】:

      【解决方案3】:

      两者都是 sql 查询,只是在第二个中您使用 php 进行查询,而不是像第一个那样直接进行。

      如果你正在构建的是一个网页,你需要用php或jsp来做,因为在这种情况下你不能直接做。

      但是,如果您要问哪个更快,那毫无疑问是第一个。但是它的使用仅限于 SQL 平台,而不是全局与 php。

      【讨论】:

        【解决方案4】:

        我假设在第一种方法中您仍然使用 PHP 来执行查询。

        如果您正在接受用户输入,那么第二种方法绝不是保护您免受 SQL 注入的影响。为此,您需要参数化查询。

        另外,方法 1 绝对是要走的路 - 在不使用 PHP 的情况下,您越接近所需的结果越好。

        【讨论】:

        • 第二种方法是保护 OP,因为它们没有在查询中使用任何变量,但这是一种可怕的方法。
        • 虽然效率低,但请说明方法2在什么情况下允许SQL注入?
        • @MonkeyZeus “如果您正在接受用户输入”。我假设 OP 使用伪代码并且最终产品将是动态的,基于他似乎认为第二种方法可以防止注入而第一种方法没有。
        • 充其量,OP 的问题不清楚且完全被误导,但基于所提供的纯代码,方法#2 不可能进行 SQL 注入,因此提供基于猜想的答案确实是不明智的。即使是用户输入,我也只能想象数字879 会被一个变量替换,即使这样也只是一个 PHP 比较......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 2020-10-08
        • 2020-02-12
        • 2013-05-02
        • 2017-03-30
        • 2020-12-28
        • 2012-05-28
        相关资源
        最近更新 更多