mysql 分区表 range
创建分区
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,归档分区历史数据非常方便,提供了一个交换分区的方法
分区数据归档迁移条件:
- MySQL>=5.7
- 结构相同
- 归档到的数据表一定要是非分区表
- 非临时表;不能有外键约束
- 归档引擎要是: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相关推荐
- mysql 分区表 归档_MySQL分区表
1,MySQL分区表作用 当单表的数据量较大,需要进行定期的数据归档删除时,或者提高查询性能,都可以采用分区: 2,分区表设置 分区的种类 range分区 list分区 hash分区 key分区 ra ...
- 数据切分——Mysql分区表的管理与维护
关于Mysql分区表的介绍可以参考: http://blog.csdn.net/jhq0113/article/details/44592865 关于Mysql分区表的创建可以参考: http://b ...
- Mysql分区表的使用
简单来说,分区表就是把物理表结构相同的几张表,通过一定算法,组成一张逻辑大表.这种算法叫"分区函数",当前 MySQL 数据库支持的分区函数类型有 RANGE.LIST.HASH. ...
- 数据切分——Mysql分区表的建立及性能分析
Mysql的安装方法可以参考: http://blog.csdn.net/jhq0113/article/details/43812895 Mysql分区表的介绍可以参考: http://blog.c ...
- 简述MySQL分区表类型
分区是将一个表的数据按照某种方式,比如按照时间上的月份,分成多个较小的,更容易管理的部分,但是逻辑上仍是一个表.我们在此之前已经讲过MySQL分区表的原理,分区有利于管理非常大的表,它采用分而治之的逻 ...
- Mysql分区表概述、分区类型、分区管理
另有一篇简单易懂的好文章帮助学习 Mysql分区表的原理和优缺点以及注意点 一.分区概述 分区是指根据一定的规则,数据库把一个表分解成多个更小的.更容易管理的部分.分区有利于管理非常大的表. MySQ ...
- mysql表分区数量限制_详解MySQL分区表的局限和限制的代码实例
本文对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的 原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的朋友可以去官方网站查阅. 禁止构建 分区表达式不支持以下几种构建: ...
- 如何创建mysql分区表_mysql分区表创建思路
mysql分区表有range,list,hash,key,其中每个分区又有特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区.对于HAS ...
- mysql分区表truncate分区数据_详解MySQL分区表
前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...
最新文章
- loj10095 间谍网络
- learnByWork
- 网易来聊聊子弹短信的消息漫游技术
- Filter和Listener-学习笔记04【监听器】
- 协同旋转不变网格形变
- 兔子野鸡49只100条腿c语言,家禽生产学复习题
- 揭秘一线互联网企业 前端JavaScript高级面试
- 【kafka】kafka UnknownProducerIdException raised broker locate producer metadata producerId
- iOS开发:icon和启动图尺寸(转)
- I;P : Leaderboards and Achievements
- 怎么用EasyRecovery恢复sd卡中的数据
- 181223每日一句
- win10安装lr11
- vscode 终端美化
- CoderHelper 是怎样实现添加模块信息以及函数说明信息的?
- MISC中图片隐藏文件分离
- 树莓派如何接硬盘_树莓派3 挂载外接硬盘
- 如何区分电梯卡为id卡ic卡_门禁卡ID卡和IC卡从外表怎么区分?
- 3.5 基本属性测试
- 谷歌突然宣布!百度、滴滴懵了