如何快速修剪大表?

Ele*_*tro 5 mysql database pruning

我目前有一个大约2000万行的MySQL表,我需要修剪它.我想删除其updateTime(插入时间戳)超过一个月的每一行

前.我没有亲自对表的顺序进行任何更改,因此数据应该按插入顺序排列,并且UNIQUE在两个字段上有一个键,id并且updateTime.我如何在短时间内完成这项工作?

Wil*_*ung 14

你可以承受多少停机时间?行有多大?你删除了多少?

简而言之,删除行是您可以对表执行的最昂贵的事情之一.这总体上是一件可怕的事情.

如果您不必这样做,并且您有足够的磁盘空间,并且您的查询不受表大小的影响(索引良好的查询通常会忽略表大小),那么您可能只留下足够的空间.

如果您有机会并且可以使表离线(并且您正在删除表中的一小部分),那么您最好的选择是将要保留的行复制到新表中,删除旧表,重命名新旧的名称,然后重新创建索引.

否则,你几乎坚持使用'删除'.


Mar*_*ers 13

有两种方法可以删除大量行.首先有明显的方法:

DELETE FROM table1 WHERE updateTime < NOW() - interval 1 month;
Run Code Online (Sandbox Code Playgroud)

第二种(稍微复杂一点)方法是创建一个新表并复制要保留的数据,截断旧表,然后将行复制回来.

CREATE TABLE table2 AS
SELECT * FROM table1 WHERE updateTime >= NOW() - interval 1 month;

TRUNCATE table1;

INSERT INTO table1
SELECT * FROM table2;
Run Code Online (Sandbox Code Playgroud)

如果要删除大量行并且希望保留相对较小的行,则使用TRUNCATEDELETE使用WHERE子句快得多.