有效地从一个 table 中删除与另一个 [MySQL] 不匹配的行

Efficiently deleting rows from one table where not matching another [MySQL]

所以,我有两个 table,用户和积分。许多用户不再有积分(字面上和 table)——所以我想删除它们。我尝试通过这样做来实现这一点,但它基本上超时(两个 tables 中大约有十万行)。我正在做 select 而不是删除,因为我想在发出与删除相同的查询之前验证数据:

SELECT WWW t1 
FROM users t1
JOIN points t2 ON t1.id != t2.user_id;

两个 table 都有一个相互匹配的 ID。如果用户有积分,就会有匹配的ID。如果该用户不再有积分,则没有匹配的 ID。因此,理论上 != 应该删除所有不再需要的用户。

如何在不使我的数据库超时的情况下执行此操作?

我会推荐 not exists:

delete from users
where not exists (select 1 from points p where p.user_id = users.id)

如果您有正确的索引,这应该是一个有效的选择,即:points(user_id)

另一方面,如果要删除很大一部分 table,将要保留的行移动到临时 table 可能更简单,然后截断并重新创建 table:

create table tmp_users as 
select u.*
from users
where exists(select 1 from points p where p.user_id = u.id)

truncate table users;  -- back it up first!

insert into users select * from tmp_users;

drop table tmp_users;