Mysql 分区表类型

最近因为工作需要,需要使用Mysql的分区表。因此写几篇关于mysq分区表的文章。欢迎关注和点赞。Mysql的官方文档 ,与Mongodb的文档相比,稍显晦涩难懂,需要想清楚怎样内容表达清楚。

分区类型

Mysql数据表分区,分为下面几种类型

  1. 范围分区
  2. 列表分区
  3. 列分区
  4. 哈希分区
  5. 关键字分区
  6. 子分区

另外,Mysqldb官网中还给出了空值在分区中的处理

范围分区

按照指定字段值所在的区间范围保存到指定的分区。

列表分区

与范围分区类似,构建分区时指定分区容纳的数据值,与指定数据值相同的字段值分配到对应的分区。

哈希分区

用户指定一个哈希计算规则,依据数据记录的一列或几列值来计算出数据分区。

关键字分区

这种分区方式和哈希分区类似,不同点在于用户指定数据记录的几个字段,mysql使用用户指定的字段计算出哈希值,依据哈希值将数据划分到指定分区。指定字段,可以是整数值以外的任何一种类型的字段。mysql保证通过通过hash算法计算出来指定字段的hash值是整数类型。

分区使用

按照时间来分区是一种非常常用的分区方法。mysql并没有像其他数据库一样,显示的支持按照时间分区。但mysql按照日期,时间列来创建分区表并不困难。

当使用关键字或线性关键字构建分区表时,用户可以直接使用日期时间类型的字段来作为分区列,无需对该列进行编辑计算或转换。如使创建一个按照时间字段joined作为关键字的分区表

create table members (
    firstname varchar(25) NOT NULL,
    lastname varchar(25) NOT NULL,
    username varchar(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY KEY(joined)
PARTITIONS 6;

在mysql8.4版本中,mysql还支持使用日期,时间列作为范围分区和列表分区的分区列。当然用户还可以使用Mysql的内置函数,对时间和日期进行计算,按照计算后的返回值,将数据写入对应的分区。如下面语句中,建立了一个基于年份来分区的数据表。

create TABLE members( 
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY RANGE ( YEAR(joined)) (
    PARTITION p0 VALUES LESS THAN (1960),
    PARTITION p1 VALUES LESS THAN (1970),
    PARTITION p2 VALUES LESS THAN (1980),
    PARTITION p3 VALUES LESS THAN (1990),
    PARTITION p4 VALUES LESS THAN MAXVALUE
)

mysql对TO_DAYS(), YEAR(), TO_SECONDS()等方法在分区表使用时进行了优化。当然,用户也可以在分区表中使用其他的时间处理函数,如WEEKDAY(), DAYOFYEAR(),MONTH()等方法。

无论采用哪种分区表类型,mysql在建立分区时,都会按照分区创建的顺序,为分区自动添加从0开始的编号。当新的记录添加到分区表当中时,mysql使用分区编号来指定写入到哪个分区。如,当用户创建了一个带有4个分区的表,这些分区就会添加0, 1, 2, 3四个编号。对于范围分区和列表分区,用户需要保证每一个分区都已经定义。对于哈希分区 ,用户提供的表达式需要返回一个数字值。而对于关键字分区,mysql会在内部计算出分区号码。

分区命名

分区的命名也按照mysql id的规范,如表和数据库的命名规范。因此,分区的命名是大小写不敏感的。如下面创建分区表会失败

create table t2 ( val INT)
  partition by list(val) (
    partition mypart values in (1, 3, 5), 
    partition MyPart values in (1, 3, 5),
  )
ERROR 1488 (HY000): Duplicate partition name mypart

因为两个分区的命名没有区别,索引创建表的时候会失败。

用户指定分区表的编号时,必须是正值,不能使用指数表达式的形式,如0.8E+01,或者算式如 6-2.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

威赞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值