慢慢慢慢

不积跬步
无以至千里

MySQL在存储过程中循环删除数据

最进厂里的数据库把磁盘占满了,需要删除一部分,因为数据量大,一条简单的 delete 语句根本无法完成,通过存储过程和 while 循环来做,效率还是挺高的,顺便了解下存储过程的用法。

-- 删除已存在的
drop procedure if exists delete_data;

-- 开始创建,传入一个参数
create procedure delete_data(end_time varchar(20))
  begin
  declare i int default 0;
  while i < 100 do
    -- 这里 limit 对于要操作的数据特别多的画,是很有用的
    delete from t_target where create_time < end_time limit 10000;
  end while;
end

-- 调用
call delete_data('2019-6-1')

很短,却很有用,解决了一次性删除大量数据的问题。

2020-03-23 更新:
使用存储过程还是太慢,如果数据库做了分区,可以使用删除分区的方法比较快,我是用 python 执行的。

import datetime
import os

start_date = '2018-07-03'
end_date = '2019-10-01'

start = datetime.datetime.strptime(start_date, '%Y-%m-%d')
end = datetime.datetime.strptime(end_date, '%Y-%m-%d')

while start < end:
    start = start + datetime.timedelta(days=1)
    os.system('date && mysql -uroot -pAdmin123 gateway_target -e "alter table t_target_snapshot drop PARTITION p_t_target_snapshot_%s"' % start.strftime('%Y%m%d'))
    print('delete %s"' % start.strftime('%Y%m%d'))
本原创文章未经允许不得转载 | 当前页面:慢慢 » MySQL在存储过程中循环删除数据

评论 1

  1. I like your videos.. http://belcebendepat.gq Order Essay Writing Custom Homework

    JamesEpisk 2020-10-24    回复