MySQL 表分区操作详解
MySQL 分区的过程是将一个表或索引分解为多个更小、更可管理的部分。MySQL 的分区操作是一个物理的操作,也就是逻辑上来讲,它们是一个表和索引,但是在物理上来看,每个物理分区上都有各自的表和索引。
MySQL 支持一下几种类型的分区:
RANGE 分区
LIST 分区
HASH 分区
KEY 分区
不管创建何种类型的分区,如果表中存在主键或唯一索引时,分区列必须包含唯一索引的一个组成部分。如果表中没有主键和唯一索引,可以指定任何一个列为分区列。
RANGE 分区
一种常用的场合就是按照时间进行分区,将一个季度或者一年的记录统一存放在一个分区中。这样在查询的时候优化器能够根据我们指定的条件从对应的分区中获取数据。
LIST 分区
与 RANGE 分区类似,只不过分区是离散的,以离散的集合作为分区的条件进行分区,插入的值必须事先在集合中定义,否则将会导致插入失败。
HASH 分区
目的是将数据均匀地分散到预定义的各个分区。我们需要定义散列的方法和分区大小。LINEAR HASH 与 HASH 分区类似,只不过在哈希散列的时候不采用取模操作,而且通过处理后进行与操作,加快了散列的速度。
KEY 分区
KEY 分区与 HASH 分区类似,不同之处在于 HASH 分区需要用户自定义哈希函数,而 KEY 分区是使用 MySQL 数据库提供的函数进行分区。
COLUMNS 分区
与前面四种分区相比,COLUMNS 分区不要求将分区的列转化为整数,可以直接比较列的值。可用于替代 RANGE 分区和 LIST 分区。
子分区
MySQL 在 RANGE 分区和 LIST 分区的基础上再进行 KEY 分区和 HASH 分区。
分区中的 NULL 值
MySQL 的分区总是视 NULL 值为小于任何一个非 NULL 值,因此如果是 RANGE 分区,那么 NULL 会被分到第一个区,如果是 LIST 分区,那么 NULL 会被分到集合有 0 的那个区,如果是 HASH 分区,那么 NULL 的 HASH 值是 0,因此会被分到 0 区。
关于分区的性能分析将后面再来补,留个坑