mysql 建表 月分区_Mysql按月创建表分区

前言

下面仅记录一次对空表的一次分区过程,以日志表为例。

CREATE TABLE `sys_log` (

`log_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

`user_id` int(10) DEFAULT NULL COMMENT '用户ID',

`class_function` varchar(255) DEFAULT NULL COMMENT '类和方法名',

`function_id` int(10) DEFAULT NULL COMMENT '功能id',

`description` varchar(255) DEFAULT NULL COMMENT '功能名称',

`sub_desc` varchar(255) DEFAULT NULL COMMENT '子功能',

`ip` varchar(255) DEFAULT NULL,

`create_time` datetime DEFAULT NULL COMMENT '创建时间',

`type` int(10) DEFAULT NULL COMMENT '类型【1:异常 2:使用方法】',

PRIMARY KEY (`log_id`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

创建联合主键

删除原有主键,创建联合主键,这一步你可以在建表的时候就创建好。

ALTER TABLE `sys_log` DROP PRIMARY KEY,ADD PRIMARY KEY (log_id, create_time);

手动创建分区

手动创建分区,这一步你也可以在建表的时候就创建好。

ALTER TABLE `sys_log` PARTITION by RANGE COLUMNS (create_time)

(PARTITION `p1` VALUES LESS THAN ('2019-01-01'),

PARTITION `p2` VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB);

创建存储过程

1.创建用于对单张表分区的存储过程

CREATE DEFINER=`root`@`%` PROCEDURE `proc_create_partition`(in_tbname VARCHAR(64))

BEGIN

SELECT DATABASE() INTO @dbname;

SET @tbname = in_tbname;

#查询表的最近一次分区

SELECT

REPLACE (partition_name, 'p', '') INTO @PMAX

FROM

INFORMATION_SCHEMA.PARTITIONS

WHERE

TABLE_SCHEMA = @dbname

AND table_name = @tbname

ORDER BY

partition_ordinal_position DESC

LIMIT 1;

#查询表的最近一次分区

SELECT

REPLACE(partition_description, "'", '') INTO @DNAME

FROM

INFORMATION_SCHEMA.PARTITIONS

WHERE

TABLE_SCHEMA = @dbname

AND table_name = @tbname

ORDER BY

partition_ordinal_position DESC

LIMIT 1, 1;

SET @t=CONCAT('alter table `',@dbname,'`.',@tbname,' reorganize partition p',@PMAX,

' into(partition p',@PMAX,' values less than (''',date(DATE_ADD(@DNAME,INTERVAL 1 MONTH)),'''),',

'partition p',@PMAX+1,' values less than MAXVALUE)');

SELECT @t;

PREPARE stmt FROM @t;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

COMMIT;

END

2.创建存储过程调用单表分区存储过程对所有表进行分区

CREATE DEFINER=`root`@`%` PROCEDURE `proc_create_partition_all`()

BEGIN

DECLARE tbname varchar(32);

DECLARE tmpSql varchar(256);

DECLARE done INT DEFAULT FALSE ;

#查询已手动分区的表

DECLARE part_cursor CURSOR FOR (SELECT DISTINCT table_name FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = DATABASE() AND partition_expression IS NOT NULL AND table_name NOT LIKE '%bak');

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

#循环对表添加分区

OPEN part_cursor;

myLoop: LOOP

FETCH part_cursor INTO tbname;

IF done THEN

LEAVE myLoop;

END IF;

#调用分区存储过程

CALL proc_create_partition(tbname);

COMMIT;

END LOOP myLoop;

CLOSE part_cursor;

END

创建事件

创建事件从2019年8月起每月1号调用存储过程给表添加分区

CREATE DEFINER=`root`@`%` EVENT `e_create_partition`

ON SCHEDULE EVERY 1 MONTH STARTS '2019-08-01 00:00:00'

ON COMPLETION PRESERVE DISABLE

DO CALL proc_create_partition_all()

参考:

https://blog.csdn.net/zhangkai19910815/article/details/96424294

https://blog.csdn.net/aofavx/article/details/50393281

https://www.cnblogs.com/freeton/p/4265228.html

https://blog.csdn.net/aofavx/article/details/50378360

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这样可以提高查询的性能。创建多字段索引可以通过以下两种方式实现: 1. 创建复合索引:复合索引是指在多个字段上创建的索引。可以使用CREATE INDEX语句MySQL提供了分区来创建复合索引。例如,下面的语句创建了一个复合索引,包含两个字段(field1和field2): ``` CREATE INDEX index_name ON table_name (表的功能,可以将大表field1, field2); ```拆分成多个小表,提高查询性能和管理效率。在建表时,可以使用以下语法来创建分区表: CREATE TABLE table_name ( column1 data 这样创建的索引将按照field1和field2的顺序进行排序,并且可以在查询中使用这两个字段进行搜索。 2._type, column2 data_type, ... ) PARTITION BY partitioning_method ( PARTITION partition_name VALUES LESS THAN (value), PARTITION partition_name VALUES LESS THAN (value 创建前缀索引:前缀索引是指只对字段的一部分进行索引。可以使用CREATE INDEX语句来创建前缀索引,), ... ); 其中,table_name是要创建的分区表的名称,column1、column2等是表的列名和数据类型。partitioning_method是分区方法,可以选择以下几种: 1. RANGE分区:按照指定的范并指定字段的前缀长度。例如,下面的语句创建了一个前缀索引,只对字段field1的前10个字符进行索引: ``` CREATE INDEX index_name ON table_name (field1(10)); ```围对数据进行分区。例如,可以按照日期范围或者数值范围进行分区。 2. LIST分区:按照指定的值列表对数据进行分区。 这样创建的索引只会对字段的前10个字符进行排序,并且可以在查询中使用这个字段的前缀进行搜索。 需要注意的是,例如,可以按照地区或者部门进行分区。 3. HASH分区:根据列值的哈希值进行分区。例如,可以根据用户ID的哈希值进行分创建多字段索引可能会增加索引的大小和维护成本。因此,在创建多字段索引时,需要根据实际情况权衡性能和资源消耗。区。 4. KEY分区:类似于HASH分区,但是是根据列值的键值进行分区。 在PARTITION子句中, 可以使用VALUES LESS THAN来指定每个分区的取值范围。例如,VALUES LESS THAN (value)表示该分区存储小于value的数据。 以下是一个示例的分区表创建语句: CREATE TABLE sales ( id INT, sale_date DATE, amount DECIMAL(10,2) ) PARTITION BY RANGE (YEAR(sale_date)) ( PARTITION p0 VALUES LESS THAN (2010), PARTITION p1 VALUES LESS THAN (2015), PARTITION p2 VALUES LESS THAN (2020), PARTITION p3 VALUES LESS THAN MAXVALUE ); 上述语句创建了一个名为sales的分区表,按照sale_date列的年份进行分区。其中,p0存储2010年之前的数据,p1存储2010年到2014年的数据,p2存储2015年到2019年的数据,p3存储2020年及以后的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值