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上使用类似的方法吗?