繁体   English   中英

如何使用 MySQL 多查询优化查询?

[英]How to optimize a query with MySQL multi-query?

我需要优化脚本以获得高性能,所以问题是如何将 MySQL 多查询添加到此代码中?

foreach($multiContent as $htmlContent) {
    $email = urldecode($email['1']);
    $user = $user['1'];

    //store in db
    $db->query("UPDATE eba_users 
                   SET mail = '$email' 
                 WHERE username = '$user'");
    //echo "email is $email and user is $user\n";
  }

  //close if ($array_counter % 200
  unset($array_counter);
  unset($data);
}

如果您已经在使用 mysqli 或 PDO,您应该为您的查询使用准备好的语句,因为它们是受支持的。 由于不需要将整个查询再次发送到数据库服务器,因此这也会略微提高性能。 然而,最大的优势是准备好的语句提供了更高的安全性。

除此之外,如果您还没有,请尝试在username上添加索引以加快此查询的速度。

编辑:如果您想在一个查询中完成所有操作,正如您所建议的那样,您还可以使用上面提到的ON DUPLICATE KEY UPDATE作为对这个问题的回答:

INSERT INTO eba_users (`username`, `mail`) 
VALUES 
    ('username1','$email1'),
    ('username2','$email2'),
    ('username3','$email3'),
    ('username4','$email4'),
    ....
    ('usernameN','$emailN'),
ON DUPLICATE KEY UPDATE `mail`=VALUES(mail);

但是,这可能不如使用带有常规UPDATE准备好的语句快。

编辑 2:根据要求,这里可能是您在 mysqli 中绑定参数应该做什么的近似值:

if ($stmt = $mysqli->prepare("UPDATE eba_users SET mail= ? WHERE username= ?")) {

    /* loop through array of users */
    foreach ($array as $username => $newemail) {

        /* bind parameters for markers */
        $stmt->bind_param("ss", $newemail, $username);

        /* execute query */
        $stmt->execute();
    }
}

当然,如果失败,这不会提供任何类型的错误消息。 为此,您可以查看 mysqli::error

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM