从数据库中删除未引用的数据
Posted
技术标签:
【中文标题】从数据库中删除未引用的数据【英文标题】:Deleting non referenced data from database 【发布时间】:2016-08-29 17:37:05 【问题描述】:由于设计不好,我必须清理数据库。那里的数据未正确“连接”(未设置外键)
因此,我想删除所有未引用的数据。
我创建了一个连接临时表temp1
并插入了所有与主表entity
没有连接的Entity_ID
。下一步是,我想通过以下查询从entityisactive
中删除所有不良数据:
Delete from db1.entityisactive where db1.entityisactive.Entity_ID IN
(
Select db1.temp1.Entity_ID from db1.temp1
)
问题是,我连接超时了,当我这样做的时候Select db1.temp1.Entity_ID from db1.temp1 where Entity_ID = 42
我想要做的是删除entityisactive
entityisactive.Entity_ID = temp1.Entity_ID
中的所有条目
如何加快 SQL 查询的速度?或者我的推理错误在哪里?
【问题讨论】:
您可以创建索引并使用 NOT IN 但不是 NOT IN 会非常危险 尝试限制内部查询的结果数量,然后多次运行直到它什么都不删除:Select db1.temp1.Entity_ID from db1.temp1 LIMIT 1000
不在的危险:***.com/a/32175659
@Drew OP 没有询问 NOT IN
@alfasin 我警告使用它
【参考方案1】:
我建议使用明确的join
,然后定义索引。代码如下所示:
Delete eia
from db1.entityisactive eia join
db1.temp1 t
on eia.Entity_ID = t.Entity_ID ;
然后,此查询需要temp1(Entity_Id)
或entityisactive(Entity_Id)
上的索引。两个索引都不是必需的,第二个可能有更好的性能。
【讨论】:
我在entityisactive
表上有索引。坦克的答案,它工作完美。以上是关于从数据库中删除未引用的数据的主要内容,如果未能解决你的问题,请参考以下文章
记一次数据库图片引用和服务器文件对比 删除未引用的服务器图片1