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

打印 上一主题 下一主题

主题 1014|帖子 1014|积分 3042

引言

分库分表相信大家都听说过,但(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,那与之对应的行数据会一起被放入到第一个分区中存储。
   但是这种分区类型,

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表