1、什么是分区表
分区表是一个逻辑表,但底层是由多个物理子表组成的,分区表的实现其实是对一组底层表的句柄对象的封装,对分区表的请求都通过句柄对象转化为对存储引擎的接口调用,分区对于sql层来说是一个完全封装的黑盒子,但其实底层每一个分区都有一个使用#分割命名的表文件。
2、分区表和分表的区别
(1)概念上的区别:
分表:是通过一定的规则,将一张表分解为N张不同的表,再物理层面也是多张表;
分区:逻辑上是一张表,只是把一张表分成了N多个物理区块,这些区块可以在同一个磁盘、也可以在不同的磁盘。
(2)实现方式上的区别
每一张表都对应了3个文件:一个.MYD数据文件、一个.MYI索引文件、一个.FRM表结构文件
分表:mysql的分表是物理上的分表,每一个小表都是完整的一张小表,都对应3个文件;
分区:分区后还是一张表,但是存放的数据的区块变多了;分区后根据一定的规则把数据文件和索引文件进行了分割,还多出一个.par文件,该文件记录了这张表的分区信息;
(3)数据处理上
分区:只是把存放数据的文件分成了许多小块;
(4)提高性能上
分表:分表后,单表的并发能力提高了,磁盘IO性能更高了,为什么能够提高并发呢?因为查询一次花的时间变短了,如果出现并发,可以把压力分个不同的子表;磁盘IO为什么高了呢?因为本来 把一个非常大的数据文件也分摊到了各个小表的数据文件上了。
分区:重点是想突破磁盘io瓶颈,想提高磁盘读写的能力来增加mysql的性能;在这一点上分区和分表的侧重点不同,分表重点是存取数据时提高mysql的并发能力(因为压力都分散到了不同的表上,而且查询性能高、时间短了);而分区重点是突破磁盘的读写能力(因为数据在物理上被分为了多个小块来存储,读写时只需要读取那一小块即可)。
分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式;访问量不大,但是表数据很多的表,我们可以采取分区的方式。
3、分区表的好处
(1)分区表把数据存放在不同的物理区块上,提高了磁盘io性能;
(2)可优化查询,在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率,涉及sum、count语句时,也可以在多个分区上并行处理,最好再汇总;
(3)分区更易维护,如:批量删除大量数据可以清楚整个分区;
(4)使用分区可避免某些特殊的瓶颈,如InnoDB的单个索引的互斥访问等。
(5)并行处理性能更高。
4、分区表的限制
(1)一个表最多只能有1024个分区;
(2)分区字段要么不包含主键或者索引列,要么包含全部主键和索引列;‘
(3)不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区。
5、mysql支持的分区类型
(1)range分区:根据数值的区间范围分区,分区的区间范围值是顺序的,且不能重叠;分区键的值如果有null,将被作为最小值来处理;插入的值不再现有分区内会报错,所以要预估现有分区,及时新增新的分区。
(2)list分区:按照list中的值分区,partition p0 values in (3,5);值为3和5的在一个分区;分区值不需要按照顺序,插入的值不再list范围内会报错;null值必须在分区列表中否则不被接受
(3)hash分区:主要用于分散热点读,确保数据在预先确定个数的分区中尽可能平均分布,null值被当作0值处理;分为常规hash分区:
常规hash分区:使用取模算法,优点是数据均匀分布,缺点是不适合经常变动的需求,比如数据量增大后由mod(n,4)变为mod(n,6),这样大部分数据就需要重新计算分区,线下hash分区很好的解决了这个问题。
线性分区:分区函数是一个线性的2的幂的运算法则
(4)columns分区:在mysql5.5中引入,解决了range分区和list分区值只支持整数的问题,columns分区可细分为range columns分区和list columns分区,他们都支持整数、日期时间、字符串三大类型,也可支持多列分区
(4)key分区:以上几种分区都要求分区键必须是int类型的,或者表达式返回int类型,但是key分区可以使用其他类型的列(blob、text类型)
6、什么时候使用分区表
数据量达到1g时就该考虑分区,对于历史数据的修改不多的情况下也可以考虑分区
装载:https://my.oschina.net/zhengyp/blog/494038
https://my.oschina.net/u/195896/blog/75029
https://my.oschina.net/u/131940/blog/550154