我可以只在 MYSQL 中选择一列而不是所有列以使其更快吗?


Can I just SELECT one column in MYSQL instead of all, to make it faster?

我想做这样的事情:

$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'];

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

div class="answers">

你一针见血:你想做的是SELECT userid FROM users WHERE username='$username'.试试吧 - 它会:)工作

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

顺便说一句,您可能希望使用较新的mysqli库或PDO。这些也比旧的mysql库更有效,旧的mysql库正在被弃用。

你不仅可以,而且应该。不幸的是,太多的年轻开发人员养成了选择太多数据的习惯。运行查询后,无需执行 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 是第一个。

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

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

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

您的查询是正确的:

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

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

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

$the_user_id = mysql_result($result, 0);

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

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

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

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

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

您可以使用一行代码来执行此操作

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

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

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

致谢@samuel·托马斯