select id from table where date > '2020' order by id asc limit 1;
// assume this id = 123456789, and delete rows that created before this id was created
delete from table where id < 123456789;
如果没有相关性,我有一些想法如下:
1.创建类型为Year/Date/DateTime/Timestamp、名为Created_at的新列(可能使用Date或Year),它将存储实际的年份、日期或DateTime,使用它替换类型为varchar的DATE列,可能在Created_at上创建索引,然后使用新列删除 1.如果在DATE(Varchar)上有一个索引,由于%sign in LIKE子句会导致服务器不使用索引,所以它肯定是一个全表扫描,你能像列举所有像‘01-01-2020’,‘01-02-2020’一样的日期,一个日期一个日期地删除行,用一个脚本,我认为这样至少你可以使用索引 1.如果行太多,比如10年甚至更长时间,是否可以在2年内将数据迁移到新表中,然后删除旧表? 1.写一个脚本,每次从主键开始取10000行,删除超过2年的行,取下一行10000
last_id = 0
select * from table where id > last_id order by id asc limit 10000;
last_id = [last id of the query]
delete from table where id in (xxx);
2条答案
按热度按时间rt4zxlrg1#
我已经查过了,试过了,你可以试试
你能提供数据库或截图吗?我已经尝试了查询,但没有问题https://www.db-fiddle.com/f/syhtgVyEcSPcHRXBXHLtor/0
fxnxkyjh2#
如果主键(可能是
id
)和Date列相关,这意味着较大的id将产生较晚的日期(在本例中,它是varchar类型的,感谢P.Salmon指出这一点),那么我认为可以使用主键删除(通常是列
id
),例如:如果没有相关性,我有一些想法如下:
1.创建类型为Year/Date/DateTime/Timestamp、名为Created_at的新列(可能使用Date或Year),它将存储实际的年份、日期或DateTime,使用它替换类型为varchar的DATE列,可能在Created_at上创建索引,然后使用新列删除
1.如果在DATE(Varchar)上有一个索引,由于%sign in LIKE子句会导致服务器不使用索引,所以它肯定是一个全表扫描,你能像列举所有像‘01-01-2020’,‘01-02-2020’一样的日期,一个日期一个日期地删除行,用一个脚本,我认为这样至少你可以使用索引
1.如果行太多,比如10年甚至更长时间,是否可以在2年内将数据迁移到新表中,然后删除旧表?
1.写一个脚本,每次从主键开始取10000行,删除超过2年的行,取下一行10000