[英]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.