【问题标题】:updating column when not present in other table [large data set]当其他表中不存在时更新列[大数据集]
【发布时间】:2021-12-18 16:38:46
【问题描述】:

我有两个表 entriesusers 有以下列

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


【解决方案1】:

您可能会发现向entries 表添加索引会加快更新速度:

CREATE INDEX idx ON entries (user_id, status);

【讨论】:

  • 我从定义中删除了很多信息,但已经有一个索引。我会更新我的问题
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多