码迷,mamicode.com
首页 > 数据库 > 详细

mysql-定时对表分区

时间:2018-01-02 19:54:37      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:技术分享   tran   end   nal   tail   存在   locate   例子   ike   

1, 分区

具体可见: http://blog.csdn.net/open_data/article/details/46893331

1, 分区类型: 

RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。

LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。

KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

2), 为什么分区

为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。

分区的一些优点包括:

  • 与单个磁盘或文件系统分区相比,可以存储更多的数据。
  • 对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。通常和分区有关的其他优点包括下面列出的这些。MySQL分区中的这些功能目前还没有实现,但是在我们的优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。
  • 一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
  • 涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
  • 通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。

 

2, 事件

具体可见: 

http://blog.csdn.net/jesseyoung/article/details/35257527

https://www.cnblogs.com/zoro-zero/p/6511203.html

2.1, 查看事件的开启状态

show variables like ‘%event_schedule%‘;

技术分享图片

2.2, 将事件更改为开启状态

 set global event_scheduler = ON;

 2.3 查看调度事件

show processlist;

2.4 查看事件

show events;

2.5 删除事件

drop event if exists event_second;  

 

  

添加定时分区任务

1), 创建表并初始化分区(必须有初始化分区)

DROP TABLE IF EXISTS `jmx_sta`;
CREATE TABLE `jmx_sta` (
    `host` varchar(20) DEFAULT NULL COMMENT 主机,
    `time` TIMESTAMP NULL DEFAULT 0000-00-00 00:00:00,
    `object` varchar(32) DEFAULT NULL COMMENT 对象,
    `attribute` varchar(32) DEFAULT NULL COMMENT 属性,
    `value` DOUBLE,
    PRIMARY KEY (`host`, `time`, `object`, `attribute`)
) ENGINE=InnoDB CHARSET=utf8
PARTITION BY RANGE (unix_timestamp(time)) (
    PARTITION p20171231 VALUES LESS THAN (unix_timestamp(2017-12-31 23:59:59)),
    PARTITION p20180101 VALUES LESS THAN (unix_timestamp(2018-01-01 23:59:59)),
    PARTITION p20180102 VALUES LESS THAN (unix_timestamp(2018-01-02 23:59:59))
);

 

2), 添加存储过程

DELIMITER $$

USE `nres`$$

DROP PROCEDURE IF EXISTS `create_Partition_jmx_status`$$

CREATE DEFINER=`iris`@`%` PROCEDURE `create_Partition_jmx_status`()
BEGIN
/* 事务回滚,其实放这里没什么作用,ALTER TABLE是隐式提交,回滚不了的。*/
    DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
    START TRANSACTION;

/* 到系统表查出这个表的最大分区,得到最大分区的日期。在创建分区的时候,名称就以日期格式存放,方便后面维护 */
    SELECT REPLACE(partition_name,p,‘‘) INTO @P12_Name FROM INFORMATION_SCHEMA.PARTITIONS
    WHERE table_name=jmx_sta ORDER BY partition_ordinal_position DESC LIMIT 1;
     SET @Max_date= DATE(DATE_ADD(@P12_Name+0, INTERVAL 1 DAY))+0;
/* 修改表,在最大分区的后面增加一个分区,时间范围加1天 */
    SET @s1=CONCAT(ALTER TABLE jmx_sta ADD PARTITION (PARTITION p,@Max_date, VALUES LESS THAN (TO_DAYS (‘‘‘,DATE(@Max_date),‘‘‘))));
    /* 输出查看增加分区语句*/
    SELECT @s1;
    PREPARE stmt2 FROM @s1;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;
/* 取出最小的分区的名称,并删除掉 。
    注意:删除分区会同时删除分区内的数据,慎重 */
    /*select partition_name into @P0_Name from INFORMATION_SCHEMA.PARTITIONS
    where table_name=‘tb_3a_huandan_detail‘ order by partition_ordinal_position limit 1;
    SET @s=concat(‘ALTER TABLE tb_3a_huandan_detail DROP PARTITION ‘,@P0_Name);
    PREPARE stmt1 FROM @s;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1; */
/* 提交 */
    COMMIT ;
 END$$

DELIMITER ;

3, 添加定时事件

DELIMITER ||
CREATE EVENT Partition_jmx_sta_perday
     ON SCHEDULE
     EVERY 1 day STARTS 2018-01-02 23:59:50
     DO
 BEGIN
    CALL iris.`create_Partition_jmx_status`;
 END ||
 DELIMITER ;

 

 

 

mysql-定时对表分区

标签:技术分享   tran   end   nal   tail   存在   locate   例子   ike   

原文地址:https://www.cnblogs.com/wenbronk/p/8177955.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!