我有这个简单的功能:
$password = 'userinput';
$username = 'userinput02';
$bdd = new PDO('mysql:host=localhost;dbname=mydatabase', 'root', '');
$stmt = $bdd->prepare('SELECT username, hash, someinfo, someotherinfo FROM users WHERE username = ?');
$stmt->execute(array($username));
$reponse = $stmt->fetch();
if($reponse['username'])
{
if(password_verify($password, $reponse['hash']))
{
UseSomeInfo();
echo 'good password';
}
}
我想知道是否只选择用户名, 等待第一个陈述得到确认, 然后选择哈希不是一种更有效/标准/安全的方式来做同样的事情。
答案 0 :(得分:2)
考虑到如果没有匹配,您的查询将不会返回任何结果。因此,"额外"如果没有匹配项,列不会影响必须从表中返回/读取的数据量。
然而,如果有匹配,你确实需要"额外"列。因此,没有理由遭受额外查询的开销。
实际上,解析和验证额外的列有一些微不足道的开销,但它不会引人注意。
答案 1 :(得分:0)
通常,使用一个查询返回同一行中的其他列比执行第二个查询以从同一行返回列更有效。
在服务器端,接收SQL文本,解析它,确定语句在语法上是正确的,验证语句在语义上是正确的(例如,所有标识符都是有效的,用户对对象具有适当的权限),准备执行计划,然后实际执行计划(获取锁,访问行,实现结果集),将结果集返回给调用者。
在username
列上给出合适的索引,准备好的计划的实际“执行”时间将只占整个服务器时间的一小部分。
只有在没有合适的索引时,此查询的实际执行时间才是服务器已用时间的最大份额,并且MySQL必须对表进行全面扫描,或者有多个会话争用锁在桌子上。对同一表单的第二个查询将表现出相同的性能特征。
在客户端,存在分配资源,形成要发送到服务器的SQL文本以及接收和处理返回的结果集的开销。
在OP示例代码中,很明显将现有查询分解为两个单独的查询会有性能损失。