最近一直在复习MySQL分区表相关的知识,就简单整理下读书笔记。下面我们先来对mysql分区简单介绍下。
分区的概述
分区的过程是将一个表或索引分解为多个更小、更可管理的部分。从逻辑上讲,只有一个表或一个索引,但是在物理上这个表或索引可能由数十个物理分区组成,每个分区都是独立的对象,可以独立处理,也可以作为一个更大对象的一部分进行处理。
- 支持分区的存储引擎有:InnoDB、MyISAM、NDB等。
- MySQL数据库支持的分区类型为水平分区,并不支持垂直分区。
- MySQL数据库的分区是局部分区索引,一个分区中既存放了数据又存放了索引,MySQL 不支持全局分区。
- 当前MySQL 数据库支持一下几种类型的分区:range分区、list 分区、hash分区、key分区。
- 不论是何种分区如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分。
对于第4小点可能不是很好理解,下面笔者来做几个测试来帮助理解。
(1) 表只包含唯一索引
CREATE TABLE t1 (
col1 INT NOT NULL,
col2 DATE NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
UNIQUE KEY (col1,col2)
)
PARTITION BY HASH(col3)
PARTITIONS 4;
执行结果:A PRIMARY KEY must include all columns in the table's partitioning function
分析: 由于不满足分区列必须是唯一索引的一个组成部分这一规则,因此报错。如果 改成 partition by hash(col1)或者partition by hash(col2) 又或者是 partition by hash(col1+col2) 都可以执行成功。
(2) 表只包含主键索引
CREATE TABLE t1 (
col1 INT NOT NULL,
col2 DATE NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
primary key (col1)
)
PARTITION BY HASH(col3)
PARTITIONS 4;
执行结果:A PRIMARY KEY must include all columns in the table's partitioning function
分析 : 同样报错,原因同上。如果改成PARTITION BY HASH(col1) 则会执行成功
(3) 既包含主键索引又包含唯一索引
CREATE TABLE t1 (
col1 INT NOT NULL,
col2 DATE NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
primary key (col1),
unique key (col3)
)
PARTITION BY HASH(col1+col3)
PARTITIONS 4;
执行结果:A PRIMARY KEY must include all columns in the table's partitioning function
分析:报错,如果是上面这种情况,经测试表明:分区键必须是主键索引和唯一索引共同的那些字段,才能创建成功,所以以上这种情况必须修改索引包含的字段,否则会执行不成功。
(4) 不包含主键,唯一索引,可以指定任何一个列为分区列
CREATE TABLE t1 (
col1 INT NOT NULL,
col2 DATE NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
KEY (col1, col2)
)
PARTITION BY HASH(col3+col4)
PARTITIONS 4;
执行结果:Query OK, 0 rows affected (0.09 sec)
分析: 由于不包含主键也不包含唯一索引,故对分区键没有特殊的要求,所以执行成功。
上面就简单展示里几个例子,如果有不理解的地方,小伙伴们可以亲自测试下。
水平分区:指将同一表中的不同行的记录分配到不同的物理文件中。
垂直分区:指将同一个表中不同列的记录分配到不同的物理文件中。
局部分区:一个分区既存放了数据又存放了索引。
全局分区:数据存放在各个分区,但是所有数据的索引放在一个对象中。
网友评论