- 一、分区表
- 1.分区表的使用场景
- 2.分区表的限制
- 3.分区表的原理
- 4.分区表的类型
- 5.在使用分区表的时候需要注意的问题
- 二、分库分表
一、分区表
1.分区表的使用场景
- 表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他均是历史数据
- 分区表的数据更容易维护(根据逻辑分区,批量删除大量数据可以使用清除整个分区的方式,也可以对一个独立分区进行优化、检查、修复等操作)
- 分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备
- 可以使用分区表来避免某些特殊的瓶颈(比如锁和IO速度)
- 可以备份和恢复独立的分区
2.分区表的限制
- 一个表最多只能有1024个分区,在5.7版本的时候可以支持8196个分区(分区有限,依版本不同改动)
- 在早期的mysql中,分区表达式必须是整数或者是返回整数的表达式,在mysql5.5中,某些场景可以直接使用列来进行分区
- 如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来
- 分区表无法使用外键约束
3.分区表的原理
- select
先打开并锁住所有表,优化器判断是否可以过滤部分分区,然后再访问各自的分区(过滤->访问) - insert
先打开并锁住所有表,然后确定哪个分区接收这条记录(确定分区->插入) - delete
先打开并锁住所有表,确定数据位置(哪个分区),再删除(确定分区->删除) - update
先打开并锁住所有表,确定数据位置(哪个分区),更新,更新后判断属于哪个分区,最后再删除原分区数据,再insert新分区(确定原数据分区->取出更新->删除原数据->寻找新分区->插入新分区)
4.分区表的类型
1.范围分区
比如id 1~100万一个分区,100,0001 ~ 200万第二个分区
语法:
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN (21)
);
2.列表分区
也是类似范围分区,不过是用in
PARTITION BY LIST(store_id) (
PARTITION pNorth VALUES IN (3,5,6,9,17),
PARTITION pEast VALUES IN (1,2,10,11,19,20),
PARTITION pWest VALUES IN (4,12,13,14,18),
PARTITION pCentral VALUES IN (7,8,15,16)
);
3.列分区
其实就是列表分区的升级版,支持非整形类型和多个列
PARTITION BY RANGE COLUMNS(c3)(
PARTITION p0 VALUES IN ('aaa') ENGINE = InnoDB,
PARTITION p1 VALUES IN ('bbb') ENGINE = InnoDB
);
4.hash分区
PARTITION BY LINEAR HASH(YEAR(hired)) PARTITIONS 4;
"4"是分区表的数量
5.key分区
PARTITION BY LINEAR KEY (col1) PARTITIONS 3;
类似hash分区,不过不支持表达式
6.组合分区
在分区的基础之上,再进行分区后存储
PARTITION BY RANGE(id)
SUBPARTITION BY HASH(sGrade) SUBPARTITIONS 2
(
PARTITION p0 VALUES LESS THAN(5),
PARTITION p1 VALUES LESS THAN(10),
PARTITION p2 VALUES LESS THAN(15)
);
5.在使用分区表的时候需要注意的问题
- 尽量避免null,因为null值会使分区过滤无效
- 分区列和索引列不匹配,会导致查询无法进行分区过滤
二、分库分表
mycat
// TODO