【问题标题】:Efficient MySQLi query高效的 MySQLi 查询
【发布时间】:2021-12-29 14:49:02
【问题描述】:

我只是在寻找有关使用以下方法查询大型 SQL 数据库的最有效方法的说明 MySQLi 查询。

对于用户注册表单,如果输入表单的用户名已经存在,我希望检查 SQL 数据库中的用户表(出于安全原因不一定称为用户)。对于大型用户表,如果不使用高效查询,可能会拖慢网站速度。

请注意,表中的每个用户都有一个唯一的id

在下面的 MySQLi 查询中使用 LIMIT 1,我可以在找到 1 个匹配后停止查询。

$username = $_POST['username'];
$database = mysqli_connect($dbServer, $dbUser, $dbPassword, $dbName);
$query = "SELECT `username` FROM `".$table."` WHERE `username` ='".mysqli_real_escape_string($database, $username)."' LIMIT 1";

if (mysqli_query($database, $query)) {
    die ("User exists");
}

我被引导相信以下更有效

$username = $_POST['username'];
$database = mysqli_connect($dbServer, $dbUser, $dbPassword, $dbName);
$query = "SELECT `username` FROM `".$table."` WHERE `username` ='".mysqli_real_escape_string($database, $username)."'";

$result = mysqli_query($database, $query);

if (mysqli_num_rows($result) > 0) {
    die ("User exists");
}

但是,我原以为查询仍在被调用以创建 $result 并且没有 LIMIT 设置它会减慢速度。我对么?哪个效率更高?

【问题讨论】:

  • 如果username 被索引,无论哪种方式都应该很快。您不应该转义数据、参数化和使用准备好的语句。 explain 对 2 个执行路径显示什么?直接执行 MySQL 和 MySQLi 的行为是否不同?
  • @user3783243 - 如果您的意思是每个用户都有一个唯一的id,那么是的,他们有。我没有转义数据库中的数据,我正在转义访问者输入表单的数据以防止 SQL 注入
  • 我的意思是username 上面有索引吗?您不应该转义数据。
  • 我希望两者之间的任何性能差异都可以忽略不计。但是,如果您想衡量任何此类差异,那么您需要衡量该差异。作为专家猜测,我怀疑通过使用带有查询参数的准备好的语句而不是 potentially-sql-injectible 字符串连接,您会在多次执行中看到更多的性能提升,因为准备好的语句会更容易允许数据库引擎缓存执行计划,知道唯一的区别是参数值。

标签: php mysqli


【解决方案1】:

我没有尝试对这两者进行计时 - 一般来说,mySQL 中的效率是关于正确的索引和避免将查询放在可以避免的循环中,因为大部分时间都花在解释您的查询上。在简单的语句中,将您想做的事情放在 select 语句中,让 mySQL 优化处理细节几乎总是一个好主意。我会使用 LIMIT 1 让它对你想要的最多一个答案的信息起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2022-01-04
    • 2011-09-03
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多