MYSQL中我能只选择一个列而不是全部列来提高查询速度吗?

10

我想做这样的事情:

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

但是有没有更高效的方法呢?非常感谢,问候


只选择你需要的内容是一个好习惯。你对此有什么特别的问题吗? - zerkms
https://dev59.com/gXRA5IYBdhLWcg3w0xjk - James Black
嗨,我其实不知道如何完成第二行,也就是声明一个变量并将查询结果赋值给它。 - eric01
实际上,另一个用户告诉了我如何做。非常感谢您的回复。 - eric01
6个回答

13
你说得很对,你想要做的是 SELECT userid FROM users WHERE username='$username'。试一下 - 它会成功的 :)
几乎总是不好的主意使用SELECT *; 最好指定你想让MySQL返回的列的名称。当然,你仍然需要使用mysql_fetch_assoc或类似的东西将数据实际地放入PHP变量中,但至少这样可以避免MySQL发送所有你不会使用的列的开销。
另外,你可能想要使用较新的mysqli库或PDO。这些也比即将被弃用的旧mysql库更有效率。

嗨,感谢您的回复。但我的问题是我不知道如何将一个值分配给变量声明$the_user_id= ...。问候 - eric01
1
你仍然需要使用已经编写的代码,使用 mysql_fetch_asoc;避免使用 SELECT * 可以节省 MySQL 大量的开销,因为它可以避免发送你不会使用的数据。 - Daan
感谢您的解释。我正在阅读有关PDO的内容。问候 - eric01

4

不仅可以,而且应该这样做。不幸的是,太多年轻的开发者习惯于选择过多的数据。一旦运行查询,您就不需要使用 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 表示第一行。

3

您的查询是正确的:

$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);

这里假设您只会获得一行数据。

3
"通常"的方式是仅选择所需的列。任何不需要的选择中的列都会减慢检索速度。这部分是由于网络流量,另一部分是因为数据库引擎可以应用某些优化,如果只选择了一些列。在生产代码中,“select *”通常不被赞同。请注意保留HTML标记。

2

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

此外,如果您想更进一步地进行超级优化,请尝试添加LIMIT,像这样:$query=mysql_query("SELECT userid FROM users WHERE username='$username' LIMIT 1");

当然,这假设您只期望返回一个userid,并且一旦找到它,将使数据库引擎停止。

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


0

你可以用一行代码完成这个操作

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的贡献


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接