【发布时间】:2021-12-18 16:38:46
【问题描述】:
我有两个表 entries 和 users 有以下列
create table entries
(
id int(11) unsigned auto_increment primary key,
user_id int unsigned null,
status enum ('active', 'inactive', 'blocked')
)
create index user_id on entries (user_id);
------------------------
create table users
(
id int(11) unsigned auto_increment primary key,
email varchar(255) not null,
name varchar(255) not null,
phone varchar(255) not null
)
users 表中有 500 万条记录,entries 表中有大约 2000 万条记录,其中很多有悬空的 user_id 值,这意味着 user_id 指向 @987654328 中不存在的值@表。
我想尽可能高效地更新entries 中的这些值,而无需锁定整个表以进行更新数分钟。
我尝试通过每次提供不同的状态来使用批量更新,即
UPDATE entries
SET user_id = null
WHERE user_id IS NOT NULL
AND status = 'active'
AND NOT EXISTS(SELECT id
FROM users
WHERE id = entries.user_id);
但几分钟后不得不终止查询。有什么建议吗?
【问题讨论】:
-
一个用户可以拥有多个状态吗?听起来很奇怪,所以我不得不问
-
@RiggsFolly 用户没有状态,只有条目,他们只能有一个状态
-
请原谅我的术语错误。看起来您正在使用此查询创建孤儿。与用户相比,这就是你最终获得如此多条目的原因
-
是的,不幸的是,这是一个遗留系统,我们必须使用现有的系统......
-
从长远来看,从条目中删除这些孤儿不是有益的吗
标签: mysql sql optimization