玩转MySQL:你知道什么是表分区吗

引言

分库分表相信大家都听说过,但(partitioning)表分区这个概念却鲜为人知,MySQL在5.1版本中开始支持了表分区技术,同时在MySQL5.5中进行了优化,自从MySQL支持的绝大部分引擎都开启了表分区功能。

但到底什么是表分区技术呢?这似乎之前没怎么听说过呀,对吗?

如果你之前还没接触过表分区技术,或者只是听说但接触不深入,那就可以跟随本章携手共探鲜为人知的表分区技术!一起Let's go~

一、何谓表分区技术?

经过之前《全解MySQL专栏》中多篇文章的熏陶,大家应该能够得知一个道理:MySQL中每个数据库实例的所有数据,都会放在磁盘上来存储,默认的存储位置可通过如下命令查看:

  • show variables like '%datadir%';

在默认的存储目录下,每个数据库实例之间都用不同的文件夹隔开,每个文件夹中存储着相应库中的所有表结构文件、表数据文件、索引数据文件等,如下:

​不同存储引擎的表,其文件格式也会存在些许差异,因此你可以在其中看到很多不同的文件后缀,但不管是何种存储引擎的表,如果表中的数据量过大,都会导致相应的磁盘文件过大,因此造成数据检索时效率变低(机械硬盘),因为每当从磁盘查找一条数据时,都需要从头遍历整个磁盘文件,毋庸置疑,其效率自然很低。

1.1、表分区的概念

原本的表文件都是以完整的形式存储在磁盘中,而表分区则是指将一张表的数据拆分成多个磁盘文件,然后放到磁盘中存储,这样做的好处在于:需要去检索一条数据时,无需对一个完整的数据文件从头到尾做扫描,而只需要对某个分区文件进行扫描,这样做能够在一定程度上提升性能。

同时还能打破存储容量的限制,因为无论是Windows/Linux系统,都会存储磁盘分区的概念,在Windows中会分为C、D、E...盘,而Linux则会将磁盘划分为多个分区并挂载,一个盘符/分区的存储空间是有限的,当一张表数据增长到单个磁盘区中存不下时,就会出现相关的错误信息。

而通过表分区技术,可以将一张大表的数据,拆分到不同的磁盘分区中存放,这样可以打破存储容量的限制。

做了表分区之后,表在逻辑上还是同一张,只是磁盘中会划分为多个文件存储而已,所以表分区并不会影响原有的增删改查操作。简单来说,表分区前后的区别,就类似于数组和链表的区别:

  • 数组:逻辑上是连续的,并且物理空间上也是连续的,每个元素都是使用相邻的空间存放。

  • 链表:逻辑上是连续的,但物理空间上不一定连续,每个元素可以存到任何空间,相互之间用指针连接。

而分区之前的表文件,就类似于一个数组结构,所有的表数据都会放到同一个文件中存储,在磁盘空间上来说都是连续的。而分区之后的表文件,就类似于链表结构,表数据会分开存放到不同的磁盘空间中,在磁盘上会形成多个表数据文件,各分区之间用指针地址的方式产生关联,也就是上一个分区中,会存放下一个分区的磁盘地址,以便于提供CRUD时的数据支持。

1.2、表分区带来的优势

  • ①相较于使用单个文件存储表数据,表分区技术可以打破单个磁盘分区的容量限制。

  • ②对于一些失效数据,如三年前的数据,可以通过快速删除分区的方式清理,效率十分高。

  • ③能够在一定程度上提升磁盘IO时,检索数据的性能,毕竟只需对一小片磁盘表文件做寻道。

  • ④支持聚合函数的并行执行,比如sum()、count()这类函数,可以分别统计各分区的数据做汇总。

  • ⑤带来更好的数据管理性和可用性,当一个表文件受损时,不会影响其他分区文件中的表数据。

1.3、表分区的适用场景

所有基于数据库的业务大体可分为两类:

  • OLTP:在线事务处理,通常的C端项目都属于这类业务,负责基本的增删改查操作。

  • OLAP:在线分析处理,主要负责统计分析各类数据来做汇总,如用户画像分析、报表统计等。

对于OLAP类型的业务,表分区可以很好的提高查询性能,因为一般做在线分析都需要返回大量的数据,在这类业务中可以按时间分区,比如一个月用户行为等数据存在一个分区中,需要对相应的时间做分析时,只需扫描对应的时间分区即可。但在OLTP业务中,中小型项目中一般不会产生太多的数据,也不会一次性读取某张大表的10%以上的数据返回,大部分是通过索引返回几条数据就完事了,所以对于这类业务则要合理考虑分区到底值不值得,或者到底分区有没有必要。

二、表分区的方式与类型

简单的对表分区概念有了认知后,接着来聊一聊表分区的划分方式,表分区技术中只支持水平划分,啥叫水平划分呢?如下:

​所谓的水平划分也就是指按照水平线,对某个内容进行横向切割,比如一张表的数据,假设有100条数据,将前面五十条放到一个分区中,后面五十条放入到另一个分区中,这也就是所谓的水平划分法。

表分区技术中,仅支持水平划分的方式,也就是只支持对数据表,以行作为粒度进行划分。

不过虽然只支持水平划分的模式,但分区技术也会分为多种分区类型,在MySQL数据库中总共支持range、list、hash、key、sub、columns这六种分区类型,官网介绍为>>>戳我访问<<<,其中最为常用的是range分区,接着一起简单介绍一下每种分期类型的特性。

2.1、RANGE分区

range分区的含义也就是按照范围去分区,比如现在有一个整数主键,我们可以把主键作为分区键,然后实现如下分区:

  • -∞ ~ 100000:无穷小到十万之间的主键记录,放入第一个分区中。

  • 100001 ~ 200000:十万零一到二十万之间的主键记录,放入到第二个分区中。

  • 200001 ~ +∞:二十万零一到无穷大之间的主键记录,放入到第三个分区中。

不过要记住,这里是以主键作为了分区键,也就是一条数据究竟会被放入到哪个分区中,需要依据主键的值来决定,比如主键值为12345,那与之对应的行数据会一起被放入到第一个分区中存储。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值