MySQL 存储过程删除大表

1、权限问题

alter routine 编辑或删除存储过程

create routine 建立存储过程

execute 创建存储过程

2、存储过程相关的一些命令

show procedure status\G  查看数据库中有哪些存储过程

show procedure status where db = ‘db_name‘\G 查看指定数据库(db_name)中有哪些存储过程

select name from mysql.proc where db = ‘db_name‘;  查看指定数据库(db_name)中有哪些存储过程

select routine_name from information_schema.routines where routine_schema = ‘db_name‘; 查看指定数据库(db_name)中有哪些存储过程

show create procedure dbname.sp_delete_bakhistory_new \G 查看存储过程的详细内容

3、MySQL 存储过程删除大表

delimiter //
CREATE  PROCEDURE `sp_delete_bigtable_60`( )
BEGIN
declare v_id int;
declare stopflag int;
declare v_num int;
declare cursor_id cursor for select id from bigtable  where gmt_created<now()-interval 60 day;
declare continue handler for not found set stopflag=1;
open cursor_id;
repeat
fetch cursor_id into v_id;
begin
delete from bigtable  where id =v_id;
end;
set v_num=v_num+1;
 if mod(v_num,100)=0 then
 commit;
 end if;
until stopflag = 1
end repeat;
close cursor_id;
END;
//
delimiter ; 

需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。

如果是用MySQL的Administrator管理工具时,可以直接创建,不再需要声明。

MySQL 存储过程删除大表

时间: 2024-12-11 14:24:55

MySQL 存储过程删除大表的相关文章

mysql 生产库大表delete

mysql 生产库大表删除 一般线上业务增长较快,造成某些表达到分表的临界值,表行数超过2000w且查询频繁,如表业务没有较多的聚合查询的话,可以考虑按时间归档部分历史数据.现推荐2种本人之前使用过的删除方式. 按照主键或者索引拆分后分段执行,使用存储过程 需要注意这种大表删除,如果是在主库执行,尽量把会话改成语句格式,以保证不会出现复制延迟 语句如下:set session binlog_format='STATEMENT'; CREATE PROCEDURE sp_delete_data()

Mysql千万级大表优化

Mysql的单张表的最大数据存储量尚没有定论,一般情况下mysql单表记录超过千万以后性能会变得很差.因此,总结一些相关的Mysql千万级大表的优化策略. 1.优化sql以及索引 1.1优化sql 1.有索引但未被用到的情况(不建议) (1)避免like的参数以通配符开头时 尽量避免Like的参数以通配符开头,否则数据库引擎会放弃使用索引而进行全表扫描. 以通配符开头的sql语句,例如:select * from t_credit_detail where Flistid like '%0'\G

删除大表的数据:普通删除语句和游标处理的比较

一.前言 WHERE条件用不到索引的情况下如何删除大表记录?文章中只是列举出其中一种方式而已,但仍然存在很多不严谨的地方.只是 轻描淡写随着数据表越来越大,历史数据的处理将越来越困难.且过滤字段没有索引(如时间)字段,而创建索引是需要临时表空间排序的.有越来越大,创建的维护工作也随之越来越难. 除了本文介绍的方法以外,还可以通过以下几种方法来维护历史数据: 1. 创建历史表,将历史数据定期移至历史表,让源表保持"瘦小身材"(源表会有碎片,需要定期对表和索引进行重建) 2. ORACLE

Mysql 如何删除数据表中的重复数据!

1.使用distinct查询所有不重复的记录 2.创建数据表相同结构的临时表,将第一步的数据复制进去 create temporary table if not exists student_temp as (select distinct(name), sex from student); 3.truncate table student; 4.insert into student(id,name,sex) select null,name,sex from student_temp; My

mysql 存储过程 删除重复

DELIMITER $$ CREATE PROCEDURE `delRepeatCA`() BEGIN DECLARE tally INT DEFAULT 0; SELECT COUNT(rs.c_CA) INTO tally FROM          --------赋值 (SELECT COUNT(c_CA) AS c_CA FROM t_CA GROUP BY c_CA HAVING COUNT(1) > 1) rs WHILE tally>0 DO --------循环 IF(tal

【MySQL】使用硬链接的方式删除大表

Intro MySQL中删除比较大的表时,如果直接用drop table的方式进行删除,有可能会对整个实例产生影响甚至使得实例夯住.因此可以通过硬链接的方式对表进行删除,使得对生产环境的影响降到最低. drop table 的过程 持有 buffer pool mutex: 持有 buffer pool 中的 flush list mutex: 开始扫描 LRU list: 如果 dirty page 属于 drop table,那么就直接从 LRU list 中移除: 如果删除的 page 个

【优化】MySQL千万级大表优化解决方案

问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务. 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视.原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志. 方案概述 方案一:优化现有mysql数据库.优点:不影响现有业务

MYSQL百G大表正确清空方式

当我们遇到大表清空时,会有几种相应的操作方法(表player): 1. truncate table player; 2. 创建新表.rename表.然后直接drop老表 3. 创建新表.rename表.创建老表硬链接.slowrm进行大文件删除. 注:创建新表时,需要提前和开发沟通用来确认新表自增ID起始位置 下面将是几种方案的操作步骤以及优劣势 1.操作步骤: * truncate table player; 优势:操作简单 劣势:表产生元数据锁,机器资源占用过高. 结论:强烈不推荐使用 2

WHERE条件用不到索引的情况下如何删除大表记录?

如果开发人员在做表设计阶段没有考虑到大表历史数据的维护性,随着数据量越来越大,表就越来越难管理和维护.连创建索引的失败都可能会失败(因为创建索引要利用临时表空间的的排序,当临时表空间不够大创建索引的动作就会报错).如果过滤条件用不到索引,每成功完成一次delete操作就需要全表扫描一次...那么几十GB的大表,情何以堪...? 那么有什么方法可以解决这种问题吗?当然改造生产表是可以的(利用DBMS_REDEFINITION在线重定义的方法可以很好的控制阻塞时间)再者可以利用游标获取结果集每行的R