【问题标题】:Can I just SELECT one column in MYSQL instead of all, to make it faster?我可以只选择 MYSQL 中的一列而不是全部,以使其更快吗?
【发布时间】:2012-05-01 20:53:28
【问题描述】:

我想做这样的事情:

$query=mysql_query("SELECT userid FROM users WHERE username='$username'");
$the_user_id= .....

因为我想要的只是与用户名对应的用户 ID。

通常的方法是:

$query=mysql_query("SELECT * FROM users WHERE username='$username'");
while ($row = mysql_fetch_assoc($query))
    $the_user_id= $row['userid'];

但是还有比这更有效的方法吗? 非常感谢,问候

【问题讨论】:

  • 只选择您需要的内容是一种很好的做法。您对此有什么特别的问题吗?
  • 你好,我其实不知道第二行怎么做,即声明一个变量,并将查询的结果赋值给它。
  • 实际上,另一个用户告诉我怎么做。非常感谢您的回复

标签: php mysql


【解决方案1】:

是的,这是一个很好的优化实践!

另外,如果您想更进一步并使其超级优化,请尝试添加一个 LIMIT,如下所示:$query=mysql_query("SELECT userid FROM users WHERE username='$username' LIMIT 1");

当然,这假设您希望只返回一个用户 ID,并且一旦找到它就会使数据库引擎停止。

但是,最重要的是:始终转义/清理您的输入数据! (不能强调这一点)

【讨论】:

    【解决方案2】:

    你已经一针见血了:你想做的是SELECT userid FROM users WHERE username='$username'。试试吧——它会起作用的:)

    SELECT * 几乎总是一个坏主意;最好指定您希望 MySQL 返回的列的名称。当然,您仍然需要使用mysql_fetch_assoc 或类似的东西才能将数据实际放入 PHP 变量中,但至少这样可以节省 MySQL 发送所有这些您不会使用的列的开销。

    顺便说一句,您可能想改用更新的 mysqli 库或 PDO。这些也比不推荐使用的旧 mysql 库更有效。

    【讨论】:

    • 您好,感谢您的回复。但我的问题是我不知道如何将那个值分配给变量声明$the_user_id= ...Regards
    • 您仍然需要使用您已经使用mysql_fetch_asoc编写的代码;避免这种SELECT * 只会为 MySQL 节省大量开销,因为它可以避免发送您不会使用的数据。
    • 感谢您的解释。我正在阅读有关 PDO 的信息。问候
    【解决方案3】:

    不仅可以,而且应该。不幸的是,太多的年轻开发人员养成了选择太多数据的习惯。运行查询后,您无需执行 while 循环,因为您只有一条记录返回。相反,只需使用以下内容:

    $sql = sprintf( "SELECT userid FROM users WHERE username = '%s'", $username );
    $result = mysql_query( $sql ) or die( mysql_error() );
    $data = mysql_result( $result, 0 );
    
    if ( $data ) echo $data; // first userid returned
    

    mysql_result() 的第二个参数是您要检索的行索引。 0 是第一个。

    【讨论】:

      【解决方案4】:

      “通常”的方法是选择您需要的列。

      任何属于选择的一部分且不需要的列都会减慢检索速度。部分是因为网络流量,部分是因为如果只选择了一些列,数据库引擎可以应用某些优化。

      select * 在生产代码中通常不受欢迎。

      【讨论】:

        【解决方案5】:

        您的查询是正确的:

        $query = mysql_query("SELECT userid FROM users WHERE username='$username'");
        

        如果操作正确,这将起作用。请注意,$username 必须使用 mysql_real_escape_string 正确转义。我建议查看参数化查询以降低引入 SQL 注入无懈可击的风险。

        您可以更改的另一件事是使用mysql_result 而不是循环:

        $the_user_id = mysql_result($result, 0);
        

        这假设你知道你只会得到一行。

        【讨论】:

          【解决方案6】:

          只需一行代码就可以做到这一点

          echo array_values(mysqli_fetch_array($mysqli->query("SELECT name FROM user WHERE id='$userid'")))[0];
          

          在使用此之前,您必须如下所示连接到数据库

           $mysqli = new mysqli('HOST', 'USERNAME', 'PASSWORD', 'DATABASE');
          

          感谢@samuel t thomas

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-10-08
            • 2019-11-09
            • 1970-01-01
            • 2014-10-04
            • 2019-09-23
            • 1970-01-01
            • 2016-11-29
            相关资源
            最近更新 更多