Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除范围内的十亿条记录与精确ID查找MYSQL_Mysql_Sql_Performance_Sql Delete - Fatal编程技术网

删除范围内的十亿条记录与精确ID查找MYSQL

删除范围内的十亿条记录与精确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天以上,而且到目前为止没有太多的数据被删除,而且还需要更多的时间 我想如果我制作一个表,只包含我想要删除

我有一个数据库表,大约700GB,有10亿行,数据大约500GB,索引是200GB, 我试图在2021年之前删除所有数据, 2021年大约有298970576行,剩下708337583行

要删除这个,我在python shell中运行一个不间断的查询

从id<1762163840限制1000000的表_名称中删除

id->1762163840表示2021年的数据。删除1Mil行几乎需要1200-1800秒

有没有什么方法可以加快速度,因为目前的方法运行了15天以上,而且到目前为止没有太多的数据被删除,而且还需要更多的时间

我想如果我制作一个表,只包含我想要删除的所有记录的ID,然后像

从表格名称中删除,其中id在从表格名称中选择id

那会很快吗?这会比先创建一个包含所有记录的新表,然后删除它快吗


数据库设置在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将保留大量行以实现事务完整性。

交换两个表名比截断并复制回去要好。是的,如果当前数据的容量小于存档数据,则将符合条件的数据插入到新表中,然后将该表重命名为主表名将非常有效。