gpt4 book ai didi

php - MYSQL优化主键查询变化

转载 作者:行者123 更新时间:2023-11-29 12:48:52 25 4
gpt4 key购买 nike

我希望有一种更快的方法来执行此操作,因为此查询需要永远运行。我希望同时能学到一些东西。

我有来自两个不同数据库的两个表。我需要合并 id。因为第二个数据库有多个引用 id 的表,所以我必须先更改所有这些

我在 id 前面添加了数字 9696,因为没有一个 id 是以 9xxx 开头的。因此,第一个查询进入并更改所有 id,但将 9696 放在前面以防止任何交叉 id 更改。第二个从 id 中删除所有 9696,这样我们就得到了原始 id。

我正在为十几张其他 table 做这个。但我觉得必须有更好的方法。也许没有更好的方法..但我不得不问..我尝试搜索看看是否能找到,但我发现的只是如何更改主键。这不是更改所有引用的更好方法。真的有更好的方法吗?

$userResult = $mysqli->query("SELECT * FROM members WHERE forum_id!='0' AND forum_id != id");
while ($userRow = $userResult->fetch_assoc()){
$mysqli->query("UPDATE operation SET member_id='9696".$userRow['forum_id']."' WHERE member_id='".$userRow['id']."'");
}
$mysqli->query("UPDATE operation SET leader=REPLACE(leader, '9696', '') WHERE leader LIKE '9696%'");

最佳答案

您可以使用多表更新查询和算术而不是字符串操作更有效地实现此目的,如下所示:

UPDATE
members m join
operation o on
m.id = o.member_id

SET o.member_id= m.forum_id + 10000

WHERE m.forum_id !=0 AND m.forum_id != id;

UPDATE operation SET leader=leader-10000 WHERE leader > 1000;

这假设member_id和forum_id是数字,并且您的最大id值低于10,000(如果不是,则只需增加相应的加减量)。

如果您必须通过 mysqli 使用单个表来完成此操作,那么这至少可能会更好:

$userResult = $mysqli->query("SELECT forum_id, id FROM members WHERE forum_id!='0' AND forum_id != id");
while ($userRow = $userResult->fetch_assoc()){
$mysqli->query("UPDATE operation SET member_id=".$userRow['forum_id']."+10000' WHERE member_id='".$userRow['id']."'");
}
$mysqli->query("UPDATE operation SET leader=leader-10000 WHERE leader > 10000");

请注意,仅从第一个选择中检索所需的字段会给您带来较小的性能增强。

关于php - MYSQL优化主键查询变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25041772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com