介绍:
根据所使用的不同分区规则可以分成几大分区类型。
RANGE 分区:
基于属于一个给定连续区间的列值,把多行分配给分区。
LIST 分区:
类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH分区:
基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。
KEY
分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
复合分区:
基于RANGE/LIST 类型的分区表中每个分区的再次分割。子分区可以是 HASH/KEY 等类型。
无论哪种类型的分区,如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分。
一、创建测试表
CREATE TABLE `test`.`messages` (
`id` INT NOT NULL AUTO_INCREMENT,
`content` VARCHAR(50) NULL,
`createtimeInt` INT NOT NULL,
`createtime` DATETIME NOT NULL,
PRIMARY KEY (`id` , `createtimeInt`)
) PARTITION BY RANGE (createtimeInt) PARTITIONS 5 (
PARTITION part0 VALUES LESS THAN (202012) ,
PARTITION part1 VALUES LESS THAN (202101) ,
PARTITION part2 VALUES LESS THAN (202102) ,
PARTITION part3 VALUES LESS THAN (202103) ,
PARTITION part4 VALUES LESS THAN (202104));
二、添加测试数据
INSERT INTO `test`.`messages` (`id`, `content`, `createtimeInt`,`createtime`) VALUES ('1', 'hi', '202012','2020-12-01');
INSERT INTO `test`.`messages` (`id`, `content`, `createtimeInt`,`createtime`) VALUES ('2', 'hi2', '202012','2020-12-28');
INSERT INTO `test`.`messages` (`id`, `content`, `createtimeInt`,`createtime`) VALUES ('3', 'hi', '202101','2021-01-01');
INSERT INTO `test`.`messages` (`id`, `content`, `createtimeInt`,`createtime`) VALUES ('4', 'hi2', '202101','2021-01-28');
INSERT INTO `test`.`messages` (`id`, `content`, `createtimeInt`,`createtime`) VALUES ('5', 'hi', '202102','2021-02-01');
INSERT INTO `test`.`messages` (`id`, `content`, `createtimeInt`,`createtime`) VALUES ('6', 'hi2', '202102','2021-02-28');
三、测试语句是否运用了分区
EXPLAIN PARTITIONS SELECT * FROM `test`.`messages` WHERE createtimeInt=202012;#只从分区1中遍历数据
EXPLAIN PARTITIONS SELECT * FROM `test`.`messages` WHERE id>0;#从所有分区遍历数据
mysql查看当前分区表的情况:
SELECT
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
FROM information_schema.partitions WHERE
table_schema = SCHEMA()
AND table_name='messages';