【发布时间】:2022-01-04 23:06:56
【问题描述】:
DELIMITER $$
CREATE PROCEDURE sp_delete_data()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE loop_counter INT DEFAULT 0;
DECLARE retain_days datetime;
DECLARE delete_days datetime;
SET loop_counter=(SELECT ROUND(count(*)/100,0) FROM data2 WHERE datetime<(SELECT DATE_ADD(min(datetime),INTERVAL 1 DAY) FROM data2));
SET retain_days=(SELECT DATE_SUB(now(),INTERVAL 5 DAY)); -- 5 days data will keep
SET delete_days =(SELECT DATE_ADD(min(datetime),INTERVAL 1 DAY) FROM data2); -- check old data from table data2
WHILE i <= loop_counter DO
IF retain_days>delete_days THEN
DELETE FROM data2 where datetime<delete_days LIMIT 1000;
END IF;
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
我只想保留 5 天的数据,如果少于保留日期,则删除其余数据。由于每天数据生成近 2000000 行,这就是为什么很难一次性删除整个数据的原因。这就是为什么我想在每个循环中删除 100000 个数据。 这里, loop_counter 变量用于查找我们应该为这一天的数据使用多少循环。 retain_days 变量定义以查找保留日期 delete_days 变量定义以查找删除日期。 基于retain_days 和delete_days 的可变数据将保留和删除。 最后,此过程将每 1 天按事件调用一次。
我的代码循环没有按预期工作。需要专家解决方案。 如果删除这样的数据有任何性能问题,请告诉我。提前致谢
【问题讨论】:
-
您写道您的代码没有按预期工作,但未能解释这意味着什么!您收到错误消息吗?有没有意外的输出?
-
循环不工作。这些数据只有一次被删除。
-
“不起作用”是什么意思?当你尝试它时发生了什么?你收到错误信息了吗?如果您确实收到错误,请粘贴整个消息而不是解释。你得到不正确的结果吗?您得到 no 结果了吗?如果结果不正确,是什么导致它们不正确?你期待什么?你得到任何正确的结果了吗?如果是这样,它们是什么?不要让我们猜测。
-
不要这样做。当您在这个巨大的表上执行多个
SELECTs 时,您的数据库将有一个数量级的工作要做。只需运行一次删除,这样会快得多。 -
手动删除很耗时。我有 3-4 个月的数据。我想删除那些自动化的方式。 @Louis您有比这更好的解决方案吗?提前致谢。
标签: mysql sql stored-procedures mariadb