阅读分区表文档
This commit is contained in:
@@ -205,3 +205,101 @@ innodb设置了File Trailer部分来校验page是否被完全写入到磁盘中
|
|||||||
|
|
||||||
默认情况下,在innodb每次从磁盘读取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;
|
||||||
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user