MySQL/Mariadb表分区
Mariadb表分区
下面简单介绍下四种常见的分区类型:
- RANGE分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段。
- LIST分区:LIST分区和RANGE分区类似,区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。
- HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。
- KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
上述四种分区类型中,RANGE分区即范围分区是最常用的。RANGE分区的特点是多个分区的范围要连续,但是不能重叠,默认情况下使用VALUES LESS THAN属性,即每个分区不包括指定的那个值。
创建分区表
-- range 分区
CREATE TABLE `my_partition_table` (
`id` INT,
`name` VARCHAR(50),
`purchased` DATE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE( YEAR(purchased) ) (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (1995),
PARTITION p2 VALUES LESS THAN (2000),
PARTITION p3 VALUES LESS THAN (2005),
PARTITION p4 VALUES LESS THAN (2010),
PARTITION p5 VALUES LESS THAN (2015)
);
-- List 分区
CREATE TABLE `fu_bar_data_list`
(
`CODE` varchar(50) NOT NULL COMMENT '合约编码',
`NAME` varchar(50) DEFAULT NULL COMMENT '合约名称',
`G_CODE` varchar(50) NOT NULL COMMENT '商品编码',
`CYCLE` varchar(5) DEFAULT NULL COMMENT '周期',
`DATE` varchar(20) DEFAULT NULL COMMENT '时间',
`OPEN` float DEFAULT NULL COMMENT '开盘价',
`HIGH` float DEFAULT NULL COMMENT '最高盘价',
`LOW` float DEFAULT NULL COMMENT '最低盘价',
`CLOSE` float DEFAULT NULL COMMENT '收盘价',
`VOL` float DEFAULT NULL COMMENT '成交量',
`AMOUNT` double DEFAULT NULL COMMENT '持仓量',
`UPDATE_TIME` datetime DEFAULT NULL ON UPDATE current_timestamp() COMMENT '更新时间',
PRIMARY KEY (`G_CODE`,`CODE`,`CYCLE`,`DATE`),
KEY `IDX_FOR_NAME` (`CODE`)
) ENGINE = InnoDB COMMENT ='期货bar数据列表'
PARTITION BY list COLUMNS (G_CODE)(
PARTITION P_RB VALUES IN ('RB'),
PARTITION P_MA VALUES IN ('MA'),
PARTITION P_OTHER DEFAULT
);
-- 插入测试数据
INSERT INTO `my_partition_table` VALUES
(1, 'desk organiser', '2003-10-15'),
(2, 'alarm clock', '1997-11-05'),
(3, 'chair', '2009-03-10'),
(4, 'bookcase', '1989-01-10'),
(5, 'exercise bike', '2014-05-09'),
(6, 'sofa', '1987-06-05'),
(7, 'espresso maker', '2011-11-22'),
(8, 'aquarium', '1992-08-04'),
(9, 'study desk', '2006-09-16'),
(10, 'lava lamp', '1998-12-25');
查看某个分区的数据
SELECT * FROM `my_partition_table` PARTITION (p2);
增加分区
alter table `my_partition_table` add partition(
PARTITION P_M VALUES IN ('M')
);
拆分分区
alter table `my_partition_table` reorganize partition P_OTHER into(
partition P_V VALUES IN ('V'),
partition P_EG VALUES IN ('EG')
);
合并分区
alter table `my_partition_table` reorganize partition P_M, P_MA into (
partition P_MX VALUES IN ('M', 'MA')
);
清理分区数据
alter table `my_partition_table` truncate partition P_OTHER;
删除分区
alter table `my_partition_table` drop partition P_OTHER;
交换分区
-- 1.先创建与分区表同样结构的交换表
CREATE TABLE `tr_archive` (
`id` INT,
`name` VARCHAR(50),
`purchased` DATE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 2.执行exchange交换分区
alter table `my_partition_table` exchange PARTITION p2 with table tr_archive;