mysql表分区存储过程
本文为博主原创,未经允许不得转载:
由于数据库一张表数据量有几千万条,而且在不断增长,看见公司前辈写了一个创建表分区的存储过程,感觉
甚是牛逼,在此供自己保留学习。
/*PROCEDURE create_partition_by_month*/
DROP PROCEDURE IF EXISTS `create_partition_by_month`;
DELIMITER $$
CREATE PROCEDURE `create_partition_by_month`(IN_TABLENAME VARCHAR())
BEGIN
DECLARE ROWS_CNT INT UNSIGNED;
DECLARE EXPIRE_ROWS_CNT INT UNSIGNED;
DECLARE BEGINTIME TIMESTAMP;
DECLARE ENDTIME TIMESTAMP;
DECLARE PARTITIONNAME VARCHAR();
DECLARE PARTITIONRANGE INT UNSIGNED;
DECLARE EXPIRETIME TIMESTAMP;
DECLARE EXPIREPARTITION VARCHAR(); SET BEGINTIME = DATE(NOW() - INTERVAL DAY(NOW()) DAY + INTERVAL DAY + INTERVAL MONTH);
SET PARTITIONNAME = DATE_FORMAT( BEGINTIME, 'p%Y%m' );
SET ENDTIME = DATE(NOW() - INTERVAL DAY(NOW()) DAY + INTERVAL DAY + INTERVAL MONTH);
SET PARTITIONRANGE = extract(YEAR_MONTH FROM ENDTIME);
SET EXPIRETIME = DATE(NOW() - INTERVAL YEAR);
SET EXPIREPARTITION = DATE_FORMAT( EXPIRETIME, 'p%Y%m' ); SELECT COUNT(*) INTO ROWS_CNT FROM information_schema.partitions WHERE table_name = IN_TABLENAME AND partition_name = PARTITIONNAME;
IF ROWS_CNT = THEN
SET @SQL = CONCAT( 'ALTER TABLE `', IN_TABLENAME, '`',
' ADD PARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', PARTITIONRANGE ,') ENGINE = InnoDB);' );
PREPARE STMT FROM @SQL;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
ELSE
SELECT CONCAT("partition `", PARTITIONNAME, "` for table `", IN_TABLENAME, "` already exists") AS result;
END IF; SELECT COUNT(*) INTO EXPIRE_ROWS_CNT FROM information_schema.partitions WHERE table_name = IN_TABLENAME AND partition_name = EXPIREPARTITION;
IF EXPIRE_ROWS_CNT = THEN
SELECT CONCAT("partition `", EXPIREPARTITION, "` for table `", IN_TABLENAME, "` not exists") AS result;
ELSE
SET @SQL = CONCAT( 'ALTER TABLE `', IN_TABLENAME, '`', ' DROP PARTITION ', PARTITIONNAME, ';' );
PREPARE STMT FROM @SQL;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END IF; END$$
DELIMITER ;
/*EVENT e_alarm_partition*/
DROP EVENT IF EXISTS `e_alarm_partition`;
DELIMITER $$
CREATE EVENT IF NOT EXISTS `e_alarm_partition`
ON SCHEDULE EVERY DAY #执行周期,还有天、月等等
STARTS '2017-12-23 04:00:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT 'Creating partitions'
DO BEGIN
CALL create_partition_by_month('tbl_alarminfo');
CALL create_partition_by_month('tbl_user_log');
END$$
DELIMITER ; SET GLOBAL group_concat_max_len=;
SET SESSION group_concat_max_len=;
tbl_alarminfo为告警信息表,tbl_user_log为日志操作记录表
mysql表分区存储过程的更多相关文章
- MySQL表分区技术
MySQL表分区技术 MySQL有4种分区类型: 1.RANGE 分区 - 连续区间的分区 - 基于属于一个给定连续区间的列值,把多行分配给分区: 2.LIST 分区 - 离散区间的分区 - 类似于按 ...
- Mysql 表分区和性能
以下内容节选自<Mysql技术内幕InnoDB存储引擎> mysql表分区: 分区功能并不是所有存储引擎都支持的,如CSV.MERGE等就不支持.mysql数据库支持的分区类型为水平分区( ...
- Mysql表分区的选择与实践小结
在一些系统中有时某张表会出现百万或者千万的数据量,尽管其中使用了索引,查询速度也不一定会很快.这时候可能就需要通过分库,分表,分区来解决这些性能瓶颈. 一. 选择合适的解决方法 1. 分库分表. 分库 ...
- MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- mysql表分区、查看分区
原文地址:http://blog.csdn.net/feihong247/article/details/7885199 一. mysql分区简介 数据库分区 数据库分区是一种物理数据库设 ...
- mysql表分区简述
一. 简介 数据库分区 数据库分区是一种物理数据库设计技术.虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间,同时对于应用来说分区完全是 ...
- mysql 表分区 查看表分区 修改表分区
原文地址:http://blog.csdn.net/feihong247/article/details/7885199 一. mysql分区简介 数据库分区 数据库分区是一种物理数据库设 ...
- Mysql 表分区
是否支持分区:mysql> show variables like '%partition%';+-----------------------+-------+| Variable_name ...
- mysql表分区(摘自 MySQL表的四种分区类型)
一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
随机推荐
- XML系列之--对电文格式XML的简单操作(三)
前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...
- 018.07 New BMW ICOM A3+B+C+D Plus EVG7 Controller Tablet PC with WIFI Function
2018.07 New BMW ICOM A3+B+C+D Plus EVG7 Controller Tablet PC with WIFI Function Software Version : ...
- JAVA获取不同操作系统的分隔符等参数
import java.util.Properties; public class SeparatorUtils { /* system properties to get separators */ ...
- modelform save
ModelForm表单 save()方法 每一个ModelForm都有一个save()方法,这个方法可以更具绑定的form表单创建并且保存一个数据库对象,ModelForm的子类可以接受一个model ...
- php 阳历转农历优化版
网上转换方法很多例子错误. 测试例子1:输入公历 2010年2月1号测试,对比百度万年历 农历应该为己丑年(2009)腊月(12月)十八. 测试例子2:输入农历1990.11.初十,丑时,公历应该为1 ...
- python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)
主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省),有四个可以实现自省函数. hasattr(object,name) 判断object中是否有name字符串对应的属性或方法,返回Tr ...
- 阿里云Maven settings.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...
- UI简述
UI的全称是user interface,即是用户界面.UI设计是指对软件的人机交互,操作编辑,界面美观的整体设计,从简单的角度来说就是,UI是视觉上的东西,包括logo.软件.网页的按钮.网页导航, ...
- enq: TM - contention一例
今天下午,有台服务器出现异常,响应特别慢,io等待奇高,awr top 5事件如下: 经回查ash,找到了造成这些事件的sql语句,如下: select * from v$active_session ...
- 20180307-Xen、KVM、VMware、hyper-v等虚拟化技术的比较
xen和kvm,是开源免费的虚拟化软件. vmware是付费的虚拟化软件. hyper-v比较特别,是微软windows 2008 R2附带的虚拟化组件,如果你买了足够的授权,hyper-v(包括hy ...