MySQL分区表
-
几个分区对应几个.ibd和一个.frm的文件
对于引擎层是4个表(4个分区)
对于server是一个表
-
分区表会影响gap lock 影响加锁范围,不同表锁不影响
-
MyiSAM是表级锁,分区对应的是多个表,表锁失效
-
分区会先将所有分区访问一遍
-
在server层认为是一张表,分区会共用一个MDL锁
-
分区便于管理数据
分区类型
前提
- 所有分区必须是一样的存储引擎
- 不能使用主键、唯一键之外的键作为分区键,要么分区表主键、唯一键没有,要么必须包含
range分区
基于一个给定的连续区间的范围(区间要求连续并且不能重叠),把数据分配到不同的分区
给定一个连续区间的范围值进行分区,某个字段的值满足这个范围就会被分配到改分区,适用于字段的值是连续的区间的字段,如 日期范围,连续的数字
list分区
设置若干个固定值分区,如果某个字段的值在这个设置的值列表中就会被分配到该分区,适用于字段的值区分度不高的,或者值是有限的,特别是像枚举这样特点的列,list分区使用in标识一些固定的值的列表
Columns 分区
在mysql5.5之前range 和list 分区只支持整数分区,可以通过额外的函数运算或者额外的转换从而得到一个整数,columns分区分别为range columns list columns 两种,支持整数(tinyint到bigint,不支持decimal和float),日期(date\datetime),字符串(char\varchar\binary\varbinary)三大数据类型
Columns分区支持一个或者多个字段作为分区键,不支持表达式作为分区键,这点类似于range和list分区,需要注意的是range columns分区键的比较时基于元组的比较,也就是基于字段组的比较,这和range分区有差异
hash 分区
hash主要是用来分散热点读,确保数据在预先确定个数的分区中可能的平均分布,对一个表执行hash分区时,mysql会对分区键应用一个散列函数,以此确定数据应当放在N个分区中的哪个分区
Mysql支持两种hash分区:
常规hash分区和线性hash分区(linear hash分区),常规hash分区使用的算法是取余算法,对应一个表达式expr是可以计算出他被保存到哪个分区中,N = MOD(expr,num)
线性hash分区使用的是一个线性的2的幂运算法则
Key 分区
和hash 差不多 区别于必须使用mysql的hash函数,支持非整数字段分区
按照key进行分区非常类似于按照hash进行分区,只不过hash分区允许使用用户自定义的表达式,而key分区不允许使用用于自定义的表达式,需要使用mysql服务器提供的hash函数,同事hash值支持整数分区,二key分区支持使用出blob or text类型外的其他类型的列作为分区键
和hash功能一样,不同的是分区的字段可以是非int类型,如字符串、日期等类型。
子分区
子分区(subpartiton): 是对分区表中每个分区的再次分割,又被称为复合分区,支持对range和list进行子分区,子分区既可以使用hash分区又可以使用key分区.复合分区适用于保存非常大量的数据记录
分区优点
分区优点
1,分区可以分在多个磁盘,存储更大一点
2,根据查找条件,也就是where后面的条件,查找只查找相应的分区不用全部查找了
3,进行大数据搜索时可以进行并行处理。
4,跨多个磁盘来分散数据查询,来获得更大的查询吞吐量