sql—高效地从一个表中删除与另一个表不匹配的行[mysql]

rqdpfwrv  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(534)

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

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

两个表都有一个相互匹配的id。如果用户有一个点,则会有一个匹配的id。如果该用户不再有点,则不会有匹配的id。因此,!=理论上应该删除所有不再需要的用户。
我如何做到这一点而不超时我的数据库?

szqfcxe2

szqfcxe21#

我建议你 not exists :

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

如果您有合适的索引,这应该是一个有效的选择,即: points(user_id) .
另一方面,如果要删除表的很大一部分,则将要保留的行移动到临时表中,然后截断并重新创建表可能更简单:

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;

相关问题