- 定义: 分区表从逻辑上来说只有一个表或者分区,从物理上表或者索引可能由数十个物理分区组成。mysql数据库支持水平分区,且为局部分区,单个分区同时存储数据+索引。
- 优势:分区表将数据划分成多个大小不一的区,单个区内查找速度会快于单表
- 分区类型:
- RANGE分区:行数据基于一个给定连续区间的列值被放入分区,也称作区间分区。可用于日期分区等
- LIST分区:面向离散的数据分区,而非连续, 可用于数据相对确定的
- HASH分区:根据用户自定义的表达式的返回值来进行分区, 可以将数据相对均匀的分布到各个分区。
- KEY分区:根据mysql数据库提高的哈希函数来进行分区
- RANGE分区:
创建表t 带1个分区
create table t (
id int PRIMARY KEY
) engine=innodb
PARTITION BY RANGE(id)(
PARTITION p0 VALUES less THAN(100)
)
插入数据
insert into t (id) values (90),(99)
查看分区信息
select * from infomation_schema.patitions
查询120,220会报错,不存在如下分区,故新增分区
alter table t add partition (
partition p1 values less than(200),
partition p1 values less than(300))
插入数据
insert into t (id) values (120),(220)
- LIST分区:
创建分区
create table t (
id int primary key
) engine=innodb
partition by list(id)(
partition p0 values in (1,2,3,4,5)
partition p1 values in (6,7,8,9,10)
)
插入数据
insert into t (id) values (1),(3),(6) 插入成功
insert into t (id) values (11),(13) 插入失败
- HASH分区
创建4个分区 需要提前确定分区数量,非自增主键由于数据本身的离散性,数据相对均匀程度会低一些,若使用自增主键分区,数据会更均匀
create table t (
id int primary key
)engine=innodb
partition by hash (id)
partitions 4
- 子分区
在主分区的基础上还可以再进行分区,称为子分区(主分区),子分区的数量可以不一致,也可以不和主分区类型一致,但是建议子分区数量保持一致,且不同分区的数据量级差距不大
1. 子分区的数据和索引都是单独存储的,映射为物理分区
2. 物理分区是指单独的数据文件、索引文件、表结构等
3. 表分区是逻辑维度,而区是存储维度。表分区是为了解决查询效率,快速影响用户查询,且每个分区都有自己单独的.idb文件,而idb文件一般由多个区构成,一个区包含连续的64个页
*疑问: 表分区更适合OLAP, 对于OLTP不是很适用?
参考文献:mysql技术内幕(innodb存储引擎)第2版
原创声明:转载自己其他账号