有效地从一个 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;
所以,我有两个 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;