Mysql 优化SQL查询

Mysql 优化SQL查询,mysql,sql,Mysql,Sql,作为一项任务,我需要清理一个电影数据库 一些用户已被删除,我必须删除数据库中不再存在的用户的评分 我提出了这个问题 DELETE rating FROM rating LEFT JOIN (SELECT id FROM user) as A ON A.id = rating.userId WHERE A.id IS NULL; 我已经在rating.userId和user.Id上建立了索引 由于有6000个用户和1000.000.000个收视率,这需要花费非常长的时间。有人能想出我如何以更好的

作为一项任务,我需要清理一个电影数据库

一些用户已被删除,我必须删除数据库中不再存在的用户的评分

我提出了这个问题

DELETE rating FROM rating LEFT JOIN (SELECT id FROM user) as A ON A.id = rating.userId WHERE A.id IS NULL;
我已经在rating.userId和user.Id上建立了索引


由于有6000个用户和1000.000.000个收视率,这需要花费非常长的时间。有人能想出我如何以更好的性能执行此查询或类似的查询吗

删除不必要的子选择

DELETE rating 
FROM rating 
LEFT JOIN user ON user.id = rating.userId 
WHERE user.id IS NULL

删除不必要的子选择

DELETE rating 
FROM rating 
LEFT JOIN user ON user.id = rating.userId 
WHERE user.id IS NULL

运行此
选择
查询并确认这些是要删除的行

SELECT * FROM rating WHERE UserId NOT IN (SELECT Id FROM user);
如果它们匹配,您可以简单地运行这样的查询

DELETE FROM rating WHERE UserId NOT IN (SELECT Id FROM user);

运行此
选择
查询并确认这些是要删除的行

SELECT * FROM rating WHERE UserId NOT IN (SELECT Id FROM user);
如果它们匹配,您可以简单地运行这样的查询

DELETE FROM rating WHERE UserId NOT IN (SELECT Id FROM user);

A.id=rating.userId其中A.id为NULL
是否等同于
rating.userId=NULL
?@njzk2不一定,我怀疑此代码是从用户不再存在的评级中删除数据。如果数据库配置了引用完整性,OP可能就不必写这个了。你能量化“疯狂的长时间”吗?疯狂的长时间不会在30分钟内完成。它用@juergen-d在23秒内完成,答案是:)你不应该在delete cascade上使用类似的方法吗?
A.id=rating.userId,其中A.id为NULL
不是等同于
rating.userId=NULL
?@njzk2不一定,我怀疑这段代码是在用户不再存在的情况下从rating中删除数据。如果数据库配置了引用完整性,OP可能就不必写这个了。你能量化“疯狂的长时间”吗?疯狂的长时间不会在30分钟内完成。它用@juergen-d在23秒内完成,答案是:)你不应该在delete cascade上使用类似的方法吗?