Range分区表建表语句如下,其中分区键必须和id构成主键和唯一键
1
2
3
4
5
6
7
8
9
10
11
12
13
|
CREATE TABLE `test1` ( `id` char (32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '自增主键(guid)' , `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `partition_key` int (8) NOT NULL COMMENT '分区键(格式:yyyyMMdd)' , PRIMARY KEY (`id`,`partition_key`), UNIQUE KEY `id_UNIQUE` (`id`,`partition_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE =utf8mb4_unicode_ci PARTITION BY RANGE (partition_key) (PARTITION p0 VALUES LESS THAN (20180619) ENGINE = InnoDB, PARTITION p20180619 VALUES LESS THAN (20180620) ENGINE = InnoDB, PARTITION p20180621 VALUES LESS THAN (20180622) ENGINE = InnoDB, PARTITION p20180622 VALUES LESS THAN (20180623) ENGINE = InnoDB, PARTITION p20180623 VALUES LESS THAN (20180624) ENGINE = InnoDB); |
新增分区
1
2
3
|
alter TABLE `test1` add PARTITION( PARTITION p20180629 VALUES LESS THAN (20180630) ENGINE = InnoDB ); |
删除分区
1
|
alter table `test1` drop PARTITION p20180629; |
Mysql不能自动创建分区,需要使用mysql event事件的方式自动创建分区
1.创建分区的存储过程如下(每次执行先校验当前分区是否存在,如果存在则不处理;不存在则创建):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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 ; #分区的名称,格式为p20180620 DECLARE PARTITIONNAME VARCHAR (9); #当前分区名称的分区值上限,即为 PARTITIONNAME + 1 DECLARE 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.partitions WHERE table_schema = IN_SCHEMANAME AND table_name = IN_TABLENAME AND partition_name = PARTITIONNAME; IF ROWS_CNT = 0 THEN SET @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; ELSE SELECT CONCAT( "partition `" , PARTITIONNAME, "` for table `" ,IN_SCHEMANAME, "." , IN_TABLENAME, "` already exists" ) AS result; END IF; END $$ DELIMITER ; |
2.数据库定时任务(每小时执行一次)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
DELIMITER $$ #该表所在的数据库名称 USE `demo`$$ CREATE EVENT IF NOT EXISTS `daily_generate_partition` ON SCHEDULE EVERY 1 hour #执行周期,还有天、月等等 STARTS '2018-06-20 00:00:00' ON COMPLETION PRESERVE ENABLE COMMENT 'Creating partitions' DO BEGIN #调用刚才创建的存储过程,第一个参数是数据库名称,第二个参数是表名称 CALL datacollectcenter.create_partition_by_day( 'demo' , 'test1' ); END $$ DELIMITER ; |
转自:http://Www.CnBlogs.Com/WebEnh/
如果想下次快速找到我,记得点下面的关注哦!
本博客Android APP 下载 |
![]() |
支持我们就给我们点打赏 |
![]() |
支付宝打赏 支付宝扫一扫二维码 |
![]() |
微信打赏 微信扫一扫二维码 |
![]() |
如果想下次快速找到我,记得点下面的关注哦!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战