删除范围内的十亿条记录与精确ID查找MYSQL
我有一个数据库表,大约700GB,有10亿行,数据大约500GB,索引是200GB, 我试图在2021年之前删除所有数据, 2021年大约有298970576行,剩下708337583行 要删除这个,我在python shell中运行一个不间断的查询 从id<1762163840限制1000000的表_名称中删除 id->1762163840表示2021年的数据。删除1Mil行几乎需要1200-1800秒 有没有什么方法可以加快速度,因为目前的方法运行了15天以上,而且到目前为止没有太多的数据被删除,而且还需要更多的时间 我想如果我制作一个表,只包含我想要删除的所有记录的ID,然后像 从表格名称中删除,其中id在从表格名称中选择id 那会很快吗?这会比先创建一个包含所有记录的新表,然后删除它快吗删除范围内的十亿条记录与精确ID查找MYSQL,mysql,sql,performance,sql-delete,Mysql,Sql,Performance,Sql Delete,我有一个数据库表,大约700GB,有10亿行,数据大约500GB,索引是200GB, 我试图在2021年之前删除所有数据, 2021年大约有298970576行,剩下708337583行 要删除这个,我在python shell中运行一个不间断的查询 从id1762163840表示2021年的数据。删除1Mil行几乎需要1200-1800秒 有没有什么方法可以加快速度,因为目前的方法运行了15天以上,而且到目前为止没有太多的数据被删除,而且还需要更多的时间 我想如果我制作一个表,只包含我想要删除
数据库设置在RDS上,实例类为db.r3.2 vCPU和15.25 GB RAM,仅运行4-5个连接。我建议重新创建要保留的数据-如果您有足够的空间:
create table keep_data as
select *
from table_name
where id >= 1762163840;
然后可以截断表并重新插入新数据:
truncate table table_name;
insert into table_name
select *
from keep_data;
这将重新创建索引
缺点是重新插入数据仍然需要一段时间,重命名keep_数据会更快。但它应该比删除行快得多
而且。这将使您有机会对表进行分区,以便可以更快地处理将来的删除。如果有这么大的表,您应该研究表分区。大删除的多种技术: 它指出,限制1000000是不必要的大,并导致更多的锁定比可能需要的 它提到,从长远来看,分区将是有益的 如果您使用Gordon的技术根据需要重建表,那么很长一段时间内您将无法访问该表;我提供了一个基本上没有停机时间的替代方案
选择中的id。。。速度可能会非常慢—这既因为in-SELECT的效率低下,也因为DELETE将保留大量行以实现事务完整性。交换两个表名比截断并复制回去要好。是的,如果当前数据的容量小于存档数据,则将符合条件的数据插入到新表中,然后将该表重命名为主表名将非常有效。