创建分区

MYSQL的分区字段,必须包含在主键字段内

1. 建立RANGE分区: 按照时间(天) 存放数据, -- 整数类型

CREATE TABLE zcy.zcy_test (user_code varchar(20)  NOT NULL, -- 工号p_date INT UNSIGNED  NOT NULL, --分区update_time TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP, -- 更新时间CONSTRAINT zcy_test_pk PRIMARY KEY (p_date,user_code) --分区列必须在主键中
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_bin
PARTITION BY RANGE (p_date) (PARTITION p20210201 VALUES LESS THAN ( 20210202 ),PARTITION p20210202 VALUES LESS THAN ( 20210203 ),PARTITION p20210203 VALUES LESS THAN ( 20210204 ),PARTITION p20210204 VALUES LESS THAN ( 20210205 ),PARTITION pmax VALUES LESS THAN maxvalue)
;PARTITION pmax VALUES LESS THAN maxvalue ,不加的话,不在范围内插入会报错
但是有个坑, 要是想新增分区大于20210204 ,就会报错,提示已经有max 了. 所以只能删除pmax后,才能加p_date=20210201 插入 p20210201 ,依次类推
range 的p_date 必须数字,字符串或者时间会报错. 所以需要转换数字

2. 建立RANGE分区: 按照时间(天) 存放数据, -- DATETIME类型

TO_DAYS(now()),TO_DAYS('2021-02-19') 到天的分区
还有year(now()), year('2021-02-19')  可以到年的分区

CREATE TABLE zcy.zcy_test_day (user_code varchar(20)  NOT NULL,p_date DATETIME  NOT NULL,update_time TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,CONSTRAINT zcy_test_month_pk PRIMARY KEY (p_date,user_code)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_bin
PARTITION BY RANGE (TO_DAYS(p_date)) (PARTITION p20210201 VALUES LESS THAN ( TO_DAYS('20210202') ),PARTITION p20210202 VALUES LESS THAN ( TO_DAYS('20210203')  ),PARTITION p20210203 VALUES LESS THAN ( TO_DAYS('20210204') ),PARTITION p20210204 VALUES LESS THAN (TO_DAYS('20210205') ),PARTITION pmax VALUES LESS THAN maxvalue)
;

3. 建立RANGE分区: 按照时间(天) 存放数据-TIMESTAMP类型

还可以unix_timestamp(now()),unix_timestamp('2021-02-19') 到天的分区

CREATE TABLE zcy.zcy_test_day_new (user_code varchar(20)  NOT NULL,p_date TIMESTAMP    NOT NULL,update_time TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,CONSTRAINT zcy_test_day_new_pk PRIMARY KEY (p_date,user_code)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_bin
PARTITION BY RANGE (UNIX_TIMESTAMP(p_date)) (PARTITION p20210201 VALUES LESS THAN ( UNIX_TIMESTAMP('2021-02-02') ),PARTITION p20210202 VALUES LESS THAN ( UNIX_TIMESTAMP('2021-02-03')  ),PARTITION p20210203 VALUES LESS THAN ( UNIX_TIMESTAMP('2021-02-04') ),PARTITION p20210204 VALUES LESS THAN (UNIX_TIMESTAMP('2021-02-05') ),PARTITION pmax VALUES LESS THAN maxvalue)
;

3. 基于RANGE COLUMNS的分区方案,而无需像上述RANGE那种,分区的对象只能为整数。-- 字符串类型

CREATE TABLE zcy.zcy_test_day_new (user_code varchar(20)  NOT NULL,p_date varchar(20)    NOT NULL,update_time TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,CONSTRAINT zcy_test_day_new_pk PRIMARY KEY (p_date,user_code)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_bin
PARTITION BY RANGE COLUMNS (p_date) (PARTITION p20210201 VALUES LESS THAN ('2021-02-02'),PARTITION p20210202 VALUES LESS THAN ('2021-02-03' ),PARTITION p20210203 VALUES LESS THAN ( '2021-02-04' ),PARTITION p20210204 VALUES LESS THAN ('2021-02-05' ),PARTITION pmax VALUES LESS THAN maxvalue)
;

插入数据后,查询指定表中的分区数据情况

SELECT table_name,partition_name,partition_description,table_rows FROM
information_schema.`PARTITIONS`  WHERE table_name = 'zcy_test_day_new';

增加分区

注意:  之前新建的分区,不能有PARTITION pmax VALUES LESS THAN maxvalue.  否在新增不上

ALTER TABLE zcy_test_day ADD PARTITION (PARTITION p20210205 VALUES LESS THAN(TO_DAYS('20210206')))ALTER TABLE zcy.zcy_test_day_new ADD partition  (PARTITION p20210205 VALUES LESS THAN('2021-02-06' ))

删除分区, 数据也会删除的

ALTER TABLE zcy.zcy_test_day_new drop partition pmax
ALTER TABLE zcy.zcy_test_day_new drop partition p2010205

分区不会自动建,存储过程+触发器

DELIMITER $$
#该表所在数据库名称
USE `demo`$$
DROP  PROCEDURE  IF EXISTS `create_partition_by_day`$$
CREATE  PROCEDURE  `create_partition_by_day`(IN_SCHEMANAME  VARCHAR (64), IN_TABLENAME  VARCHAR (64))
BEGIN#当前日期存在的分区的个数DECLARE  ROWS_CNT  INT  UNSIGNED;#目前日期,为当前日期的后一天DECLARE  TARGET_DATE  TIMESTAMP ;#分区的名称,格式为p20180620DECLARE  PARTITIONNAME  VARCHAR (9);#当前分区名称的分区值上限,即为 PARTITIONNAME + 1DECLARE  PARTITION_ADD_DAY  VARCHAR (9);SET  TARGET_DATE = NOW() + INTERVAL 1  DAY ;SET  PARTITIONNAME = DATE_FORMAT( TARGET_DATE,  'p%Y%m%d'  );SET  TARGET_DATE = TARGET_DATE + INTERVAL 1  DAY ;SET  PARTITION_ADD_DAY = DATE_FORMAT( TARGET_DATE,  '%Y%m%d'  );SELECT  COUNT (*)  INTO  ROWS_CNT  FROM  information_schema.partitionsWHERE  table_schema = IN_SCHEMANAME  AND  table_name = IN_TABLENAME  AND  partition_name = PARTITIONNAME;IF ROWS_CNT = 0  THENSET  @SQL = CONCAT(  'ALTER TABLE `' , IN_SCHEMANAME,  '`.`' , IN_TABLENAME,  '`' ,' ADD PARTITION (PARTITION ' , PARTITIONNAME,  " VALUES LESS THAN (" ,PARTITION_ADD_DAY , ") ENGINE = InnoDB);"  );PREPARE  STMT  FROM  @SQL;EXECUTE  STMT;DEALLOCATE  PREPARE  STMT;ELSESELECT  CONCAT( "partition `" , PARTITIONNAME,  "` for table `" ,IN_SCHEMANAME,  "." , IN_TABLENAME,  "` already exists" )  AS  result;END  IF;
END $$
DELIMITER ;
CREATE EVENT `job_commodity_status`ON SCHEDULE EVERY 1 DAY    --多久执行一次[HOUR|MONTH|WEEK|DAY|MINUTE|...]STARTS '2017-03-21 22:10:00'    --从什么时候开始执行ON COMPLETION NOT PRESERVE    --结束时间到了,job会被删除ENABLE    --更改计划任务状态DO    --修改计划执行体
CALL `ecommerce_job_commodity_status`();    --被执行的存储过程创建事件
CREATE EVENT 的语法如下:
CREATE EVENT
[IF NOT EXISTS] ---------------------------------------------*标注1
event_name -----------------------------------------------------*标注2ON SCHEDULE schedule ------------------------------------*标注3
[ON COMPLETION [NOT] PRESERVE] -----------------*标注4
[ENABLE | DISABLE] ----------------------------------------*标注5
[COMMENT 'comment'] --------------------------------------*标注6
DO sql_statement -----------------------------------------------*标注7标注4: [ON COMPLETION [NOT] PRESERVE]
ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被Drop掉,建议使用该参数,以便于查看EVENT具体信息。标注5:[ENABLE | DISABLE]
参数Enable和Disable表示设定事件的状态。Enable表示系统将执行这个事件。Disable表示系统不执行该事件。可以用如下命令关闭或开启事件:ALTER EVENT event_name  ENABLE/DISABLE

归档分区历史数据

我们可能有另一种需求对数据进行归档

Mysql版本>=5.7,归档分区历史数据非常方便,提供了一个交换分区的方法

分区数据归档迁移条件:

  1. MySQL>=5.7
  2. 结构相同
  3. 归档到的数据表一定要是非分区表
  4. 非临时表;不能有外键约束
  5. 归档引擎要是:archive

建表并交换分区

CREATE TABLE `arch_customer_login_log` (`customer_id` INT unsigned NOT NULL COMMENT '登录用户ID',`login_time` DATETIME NOT NULL COMMENT '用户登录时间',`login_ip` INT unsigned NOT NULL COMMENT '登录IP',`login_type` TINYINT NOT NULL COMMENT '登录类型:0未成功 1成功'
) ENGINE=InnoDB ;ALTER TABLE customer_login_log exchange  PARTITION p1 WITH TABLE arch_customer_login_log;可以发现,原customer_login_log表中的2017年的数据(p1分区中的数据)已转移到了arch_customer_login_log表中,但是p1分区未删除,只是数据转移了,所以我们还需要执行DROP命令删除分区,以免有数据插入其中将归档数据的存储引擎改为归档引擎
最后我们将归档数据的存储引擎改为归档引擎,命令为ALTER TABLE customer_login_log  ENGINE=ARCHIVE;使用归档引擎的好处是:它比Innodb所占用的空间更少,但是归档引擎只能进行查询操作,不能进行写操作

mysql 分区表 range相关推荐

  1. mysql 分区表 归档_MySQL分区表

    1,MySQL分区表作用 当单表的数据量较大,需要进行定期的数据归档删除时,或者提高查询性能,都可以采用分区: 2,分区表设置 分区的种类 range分区 list分区 hash分区 key分区 ra ...

  2. 数据切分——Mysql分区表的管理与维护

    关于Mysql分区表的介绍可以参考: http://blog.csdn.net/jhq0113/article/details/44592865 关于Mysql分区表的创建可以参考: http://b ...

  3. Mysql分区表的使用

    简单来说,分区表就是把物理表结构相同的几张表,通过一定算法,组成一张逻辑大表.这种算法叫"分区函数",当前 MySQL 数据库支持的分区函数类型有 RANGE.LIST.HASH. ...

  4. 数据切分——Mysql分区表的建立及性能分析

    Mysql的安装方法可以参考: http://blog.csdn.net/jhq0113/article/details/43812895 Mysql分区表的介绍可以参考: http://blog.c ...

  5. 简述MySQL分区表类型

    分区是将一个表的数据按照某种方式,比如按照时间上的月份,分成多个较小的,更容易管理的部分,但是逻辑上仍是一个表.我们在此之前已经讲过MySQL分区表的原理,分区有利于管理非常大的表,它采用分而治之的逻 ...

  6. Mysql分区表概述、分区类型、分区管理

    另有一篇简单易懂的好文章帮助学习 Mysql分区表的原理和优缺点以及注意点 一.分区概述 分区是指根据一定的规则,数据库把一个表分解成多个更小的.更容易管理的部分.分区有利于管理非常大的表. MySQ ...

  7. mysql表分区数量限制_详解MySQL分区表的局限和限制的代码实例

    本文对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的 原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的朋友可以去官方网站查阅. 禁止构建 分区表达式不支持以下几种构建: ...

  8. 如何创建mysql分区表_mysql分区表创建思路

    mysql分区表有range,list,hash,key,其中每个分区又有特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区.对于HAS ...

  9. mysql分区表truncate分区数据_详解MySQL分区表

    前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...

最新文章

  1. loj10095 间谍网络
  2. learnByWork
  3. 网易来聊聊子弹短信的消息漫游技术
  4. Filter和Listener-学习笔记04【监听器】
  5. 协同旋转不变网格形变
  6. 兔子野鸡49只100条腿c语言,家禽生产学复习题
  7. 揭秘一线互联网企业 前端JavaScript高级面试
  8. 【kafka】kafka UnknownProducerIdException raised broker locate producer metadata producerId
  9. iOS开发:icon和启动图尺寸(转)
  10. I;P : Leaderboards and Achievements
  11. 怎么用EasyRecovery恢复sd卡中的数据
  12. 181223每日一句
  13. win10安装lr11
  14. vscode 终端美化
  15. CoderHelper 是怎样实现添加模块信息以及函数说明信息的?
  16. MISC中图片隐藏文件分离
  17. 树莓派如何接硬盘_树莓派3 挂载外接硬盘
  18. 如何区分电梯卡为id卡ic卡_门禁卡ID卡和IC卡从外表怎么区分?
  19. 3.5 基本属性测试
  20. 谷歌突然宣布!百度、滴滴懵了

热门文章

  1. trick用法及其作用大总结
  2. 手机短信息删除了如何恢复?
  3. mysql 按月统计排序,mysql按月统计_实现mysql按月统计的教程
  4. 房地产税预期影响房价走势:一线城市继续上行
  5. 语音播报功能的几种实现办法(包含TTS)
  6. 星际迷航(FILE)基于 IPFS 协议的去中心化游戏生态
  7. line vty的原理配置及相关操作
  8. 企业开发常用之邮箱发送 抄送 简单实现
  9. 哈佛梅森学者邹传伟:泡沫与机遇——数字加密货币和区块链金融九问
  10. SRv6测试技术简介