也就是说 , 在按日期字段分区的时候 , 如果不是使用上述几个函数转换的 , 查询优化器将无法对相关查询进行优化 。
List分区 , 分区字段必须是整型或者转换为整型
按照某个字段上的规则 , 不同的数据离散地分布在不同的区中 。
create table test_list_partiotion
(
id int auto_increment,
data_type tinyint,
primary key(id,data_type)
)partition by list(data_type)
(
partition p0 values in (0,1,2,3,4,5,6),
partition p1 values in (7,8,9,10,11,12),
partition p2 values in (13,14,15,16,17)
);
对于List分区 , 分区字段必须是已知的 , 如果插入的字段不在分区时枚举值中 , 将无法插入
Hash分区 , 分区字段必须是整型或者转换为整型
Hash分区可以将数据均匀地分不到预先定义的分区中 , 使得各个分区的数据量分布基本上一致 。同样 , 分区字段必须是整型或者转换为整型
drop table test_hash_partiotion;
create table test_hash_partiotion
(
id int auto_increment,
create_date datetime,
primary key(id,create_date)
)partition by hash(year(create_date)) partitions 10;
一个很明显的问题就是 , 如果分区字段本身的分布不匀均 , 那么hash分区之后存储的分区也是不均匀的 , hash分区时对于hash的字段 , 需要慎重 。
对于单个值的查询hash分区可以定位到某一个分区

文章插图
hash分区在查询优化方面 , 无法优化范围查询 , 因为无法确定一个某个字段经过hash计算之后究竟分布了在哪个分区之中 。

文章插图
Key分区 , 分区字段必须是整型或者转换为整型
与hash分区不用的是 , key分区使用MySQL自定义的库函数进行分区 , 不需要hash分区那样对字段整型进行转换 , 同样 , 分区字段必须是整型或者转换为整型
create table test_key_partiotion
(
id int auto_increment,
create_date datetime,
primary key(id,create_date)
)partition by key(create_date) partitions 10;
对于查询优化 , Key分区的特点与Hash分区一致 , 对于单个字段可以

文章插图
column 分区
解决了分区字段必须是整型或者必须转换为整型的限制 , 可以对整型 , date或者datetime进行支持 。
create table test_column_partiotion
(
id int auto_increment,
data_type datetime,
primary key(id,data_type)
)partition by range columns(data_type) (
partition p0 values less than ('20180101'),
partition p1 values less than ('20180201'),
partition p2 values less than ('20180301'),
partition p3 values less than ('20180401'),
partition p4 values less than ('20180501'),
partition p5 values less than ('20180601'),
partition p6 values less than ('20180701'),
partition p7 values less than ('20180801')
);
四、其他例子
1.基于字段进行分区
CREATE TABLE e (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30)
)
PARTITION BY RANGE (id) (
PARTITION p0 VALUES LESS THAN (50),
PARTITION p1 VALUES LESS THAN (100),
PARTITION p2 VALUES LESS THAN (150),
PARTITION p3 VALUES LESS THAN (MAXVALUE)
);
INSERT INTO e VALUES
(1669, "Jim", "Smith"),
(337, "Mary", "Jones"),
(16, "Frank", "White"),
(2005, "Linda", "Black");
ALTER TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2;
ALTER TABLE tr DROP PARTITION p2;
2.基于hash进行分区
CREATE TABLE clients (
id INT,
fname VARCHAR(30),
lname VARCHAR(30),
signed DATE
)
PARTITION BY HASH( MONTH(signed) )
PARTITIONS 12;
3.每天增加分区
首先 , 先多增加几个分区
ALTER TABLE tb_3a_huandan_detail PARTITION BY RANGE (TO_DAYS(ServiceStartTime))
(
PARTITION p20160523 VALUES LESS THAN (TO_DAYS('2016-05-23')),
推荐阅读
- 虚拟服务器端口映射的设置方法
- MySQL主从复制没使用过?三大步骤让你从原理、业务上理解透彻
- 网线钳的使用步骤 网线钳用法
- 内外有别!相对汽车内循环而言外循环使用更有技巧
- 冬天来了 汽车暖气使用有讲究,使用不当会费油
- 秋冬季节汽车保养常识,机油更换记住3点,减少故障延长使用寿命
- 汽车上的"Auto H"按键使用法则,你了解吗?
- Mysql报too many connections详解
- Mysql访问中间件--Atlas初探
- 我常用的免费MySQL图形化管理工具
