diff --git a/mysql/mysql文档/mysql_表.md b/mysql/mysql文档/mysql_表.md index 4424fcd..c6f3cc9 100644 --- a/mysql/mysql文档/mysql_表.md +++ b/mysql/mysql文档/mysql_表.md @@ -205,3 +205,101 @@ innodb设置了File Trailer部分来校验page是否被完全写入到磁盘中 默认情况下,在innodb每次从磁盘读取page时,都会检查页面的完整性。 +## 分区表 +innodb存储引擎支持分区功能,分区过程将一个表或索引分为多个更小、更可管理的部分。 + +对于访问数据库的应用而言,逻辑上的一个表或索引,其物理上可能由多个物理分区组成,每个分区都是独立的对象,既可以独自进行处理,又可以作为一个更大对象的一部分进行处理。 + +> mysql仅支持水平分区(将同一张表中的不同行记录分配到不同的物理文件中),并不支持垂直分区(将同一张表中的不同列分配到不同的物理文件中)。 + +目前mysql支持如下几种类型的分区: +- `RANGE`: 行数据基于一个给定连续区间的列值被放入分区 +- `LIST`: 和`RANGE`类似,但`LIST`分区面对的是更加离散的值 +- `HASH`: 根据用户自定义的表达式返回值来进行分区,返回值不能为负数 +- `KEY`:根据mysql提供的哈希函数来进行分区 + +`不论创建何种类型的分区,如果表中存在唯一索引或主键,分区列必须是唯一索引的一个组成部分。` + +### partition keys & primary keys & unique keys +对于分区表而言,`所有在partition expression中使用到的col,其必须被包含在分区表所有的唯一索引中`。 + +> `所有唯一索引`中包含主键索引。 + +正确建立分区表的声明示例如下: +```sql +CREATE TABLE t1 ( + col1 INT NOT NULL, + col2 DATE NOT NULL, + col3 INT NOT NULL, + col4 INT NOT NULL, + UNIQUE KEY (col1, col2, col3) +) +PARTITION BY HASH(col3) +PARTITIONS 4; + +CREATE TABLE t2 ( + col1 INT NOT NULL, + col2 DATE NOT NULL, + col3 INT NOT NULL, + col4 INT NOT NULL, + UNIQUE KEY (col1, col3) +) +PARTITION BY HASH(col1 + col3) +PARTITIONS 4; + + +CREATE TABLE t7 ( + col1 INT NOT NULL, + col2 DATE NOT NULL, + col3 INT NOT NULL, + col4 INT NOT NULL, + PRIMARY KEY(col1, col2) +) +PARTITION BY HASH(col1 + YEAR(col2)) +PARTITIONS 4; + +CREATE TABLE t8 ( + col1 INT NOT NULL, + col2 DATE NOT NULL, + col3 INT NOT NULL, + col4 INT NOT NULL, + PRIMARY KEY(col1, col2, col4), + UNIQUE KEY(col2, col1) +) +PARTITION BY HASH(col1 + YEAR(col2)) +PARTITIONS 4; + + +create table t2_partition ( + col1 int , + col2 date, + col3 int null, + col4 int null, + unique index `idx_t2_partition_cols` (col1, col2,col3), + primary key (col2, col1) +) +partition by hash(col1) +partitions 4; +``` +#### 表中不存在唯一索引 +如果表中没有唯一索引(也未定义primary key),那么上述要求并不会生效,可以在partition expression中使用任意cols。 + +#### 后续向分区表添加唯一索引 +如果想要向分区表中添加唯一索引,那么新增的唯一索引中必须包含partition expression中所有的列。 + +#### 对非分区表进行分区 +可以参照如下示例对非分区表进行分区: +```sql +CREATE TABLE np_pk ( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(50), + added DATE, + PRIMARY KEY (id) +); +``` +可以按`id`进行分区 +```sql +ALTER TABLE np_pk + PARTITION BY HASH(id) + PARTITIONS 4; +```