Range分区表建表语句如下,其中分区键必须和id构成主键和唯一键
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | CREATETABLE`test1` (  `id` char(32) COLLATEutf8mb4_unicode_ci NOTNULLCOMMENT '自增主键(guid)',  `create_time` timestampNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT '创建时间',  `partition_key` int(8) NOTNULLCOMMENT '分区键(格式:yyyyMMdd)',  PRIMARYKEY(`id`,`partition_key`),  UNIQUEKEY`id_UNIQUE` (`id`,`partition_key`)) ENGINE=InnoDB DEFAULTCHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ciPARTITION BYRANGE (partition_key)(PARTITION p0 VALUESLESS THAN (20180619) ENGINE = InnoDB, PARTITION p20180619 VALUESLESS THAN (20180620) ENGINE = InnoDB, PARTITION p20180621 VALUESLESS THAN (20180622) ENGINE = InnoDB, PARTITION p20180622 VALUESLESS THAN (20180623) ENGINE = InnoDB, PARTITION p20180623 VALUESLESS THAN (20180624) ENGINE = InnoDB);  | 
新增分区
| 1 2 3 | alterTABLE`test1` addPARTITION( PARTITION p20180629 VALUESLESS THAN (20180630) ENGINE = InnoDB); | 
删除分区
| 1 | altertable`test1`  dropPARTITION 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`$$DROPPROCEDUREIF EXISTS `create_partition_by_day`$$CREATEPROCEDURE`create_partition_by_day`(IN_SCHEMANAME VARCHAR(64), IN_TABLENAME VARCHAR(64))BEGIN    #当前日期存在的分区的个数    DECLAREROWS_CNT INTUNSIGNED;    #目前日期,为当前日期的后一天    DECLARETARGET_DATE TIMESTAMP;    #分区的名称,格式为p20180620    DECLAREPARTITIONNAME VARCHAR(9);    #当前分区名称的分区值上限,即为 PARTITIONNAME + 1    DECLAREPARTITION_ADD_DAY VARCHAR(9);    SETTARGET_DATE = NOW() + INTERVAL 1 DAY;    SETPARTITIONNAME = DATE_FORMAT( TARGET_DATE, 'p%Y%m%d');    SETTARGET_DATE = TARGET_DATE + INTERVAL 1 DAY;    SETPARTITION_ADD_DAY = DATE_FORMAT( TARGET_DATE, '%Y%m%d');    SELECTCOUNT(*) INTOROWS_CNT FROMinformation_schema.partitions    WHEREtable_schema = IN_SCHEMANAME ANDtable_name = IN_TABLENAME ANDpartition_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);");        PREPARESTMT FROM@SQL;        EXECUTESTMT;        DEALLOCATEPREPARESTMT;     ELSE       SELECTCONCAT("partition `", PARTITIONNAME, "` for table `",IN_SCHEMANAME, ".", IN_TABLENAME, "` already exists") ASresult;     ENDIF;END$$DELIMITER ; | 
2.数据库定时任务(每小时执行一次)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | DELIMITER $$#该表所在的数据库名称USE `demo`$$CREATEEVENT IF NOTEXISTS `daily_generate_partition`ONSCHEDULE EVERY 1 hour#执行周期,还有天、月等等STARTS '2018-06-20 00:00:00'ONCOMPLETION PRESERVEENABLECOMMENT 'Creating partitions'DO BEGIN    #调用刚才创建的存储过程,第一个参数是数据库名称,第二个参数是表名称    CALL datacollectcenter.create_partition_by_day('demo','test1');END$$DELIMITER ; | 
    转自:http://Www.CnBlogs.Com/WebEnh/
如果想下次快速找到我,记得点下面的关注哦!
| 本博客Android APP 下载 | 
|  | 
| 支持我们就给我们点打赏 | 
|  | 
| 支付宝打赏 支付宝扫一扫二维码 | 
|  | 
| 微信打赏 微信扫一扫二维码 | 
|  | 
如果想下次快速找到我,记得点下面的关注哦!
 
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号