一文详解MySQL分区,分片,分库与分表

文章详细介绍了MySQL中的分区和分库分表技术,包括垂直分区和水平分区的概念、优点和不足。分库分表用于应对数据量大、高并发场景,以提高数据库性能和扩展性。此外,还提到了分片策略以及MySQL的索引优化和锁机制,旨在优化数据库的读写效率。
摘要由CSDN通过智能技术生成

目录

基本概念

分区

分类

垂直分区(VerticalPartitioning)

水平分区(HorizontalPartitioning)

优点

不足

分库分表

标准

分表

垂直分表

水平分表

分库

优点

不足

分片


MySQL索引优化_Cat凯94的博客-CSDN博客

MySQL慢查询优化_Cat凯94的博客-CSDN博客

一文详解MySQL各种锁及MVCC的使用场景及原理

Mysql日期格式转化问题_Cat凯94的博客-CSDN博客


基本概念

  • 分区:(单节点层面)把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,但在逻辑上依然是一个整体,开发人员在数据操作时仍然是对这个整体大表进行操作,之后由数据库底层自己去寻找对应的分区进行操作,数据库底层寻找分区这个过程对开发人员来说是透明的,这样在数据操作时可以只对特定分区操作以提高效率
  • 分库分表:单张表过大,把一张表分成多个小表,而分库是指:分表能够解决单表数据量过大带来的查询效率下降的问题,但是,却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此需要对数据库进行拆分,从而提高数据库写入能力,即分库
  • 分片:分库+分表,分片是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,其主要目的是为突破单节点数据库服务器的 I/O 能力限制解决数据库扩展性问题

分区

分区就是将表物理截断,但在逻辑上依然是一个整体,开发人员在数据操作时仍然是对这个整体大表进行操作,之后由数据库底层自己去寻找对应的分区进行操作,数据库底层寻找分区这个过程对开发人员来说是透明的,这样在数据操作时可以只对特定分区操作以提高效率,存储时也可以将不同分区的物理文件分开存放

分类

垂直分区(VerticalPartitioning)

这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应所有行。

分区的作用:数据库性能的提升和简化数据管理,在扫描操作中,mysql优化器只扫描保护数据的那个分区以减少扫描范围获得性能的提高。

水平分区(HorizontalPartitioning)

这种形式的分区是对根据表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。
所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。水平分区一定要通过某个属性列来分割。常见的比如年份,日期等。具体有以下几种方法:

  • RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
  • LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
  • HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
  • KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
  • 子分区(复合分区):采用range分区或者list分区的表,进行二次分区,二次分区只能为hash分区或者key分区。这种分区方式有两种建表写法,一种是指定子分区名,一种是不指定子分区名由系统默认。
  • columns分区:包含range columns和list columns两种,分区字段可以不为整型,可以有多个

优点

  • 扩容:与单个磁盘或文件系统分区相比,可以存储更多的数据。
  • 便于增删:对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。
  • 便于查询:一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
  • 便于函数并行查询:涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
  • 提高吞吐量:通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。

不足

  • 一个表最多只能有1024个分区。
  • MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。
  • 如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。
  • 分区表中无法使用外键约束
  • MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。

分库分表

当单台MySQL请求数太高,数据查询慢,数据量太大,遇到IO瓶颈时,为了避免单库由于压力过高,导致出现上述所说的一系列问题,因而需要分库分表

标准

  • 存储占用100G+
  • 数据增量每天200w+
  • 单表条数1亿条+

分表

当一个表字段过多时,应当考虑垂直分表方案,将多余的字段拆分到不同的表中存储。当一个表的数据过多时,或者数据增长速率过快时,应当考虑通过水平分表方案,来降低单表的数据行数。

  • 垂直分表
  • 水平分表

垂直分表

单表字段分为冷字段和热字段,并且做好映射

水平分表

一般要求控制在500-1200W之间为一张表

分库

一个库一般最多支撑到并发 2000,一定要扩容了,而且一个健康的单库并发值你最好保持在每秒 1000 左右,不要太大。

  • 垂直分库:结构不同,数据不同(库级别)
  • 水平分库:结构相同,数据不同(库级别)

优点

  • 能够得到最大的性能收益,吞吐量会随机器数量呈直线性增长。
  • 能够最大程度上保障存储层的高可用,任意节点宕机都不会影响整体业务的运转。
  • 具备相当强的容错率,当一个库中的结构存在问题需要重构时,无需将所有业务停机更新。
  • 具备高稳定性,分库+配备完善的监控重启策略后,基本上能确保线上无需人工介入管理。

不足

带来一系列增删改查的隐患

(二十二)全解MySQL之分库分表后带来的“副作用”一站式解决方案! - 掘金 (juejin.cn)

分片

MySQL 大表优化方案 - 掘金 (juejin.cn)

MySQL的分片(二)——MySQL分片_马路上开飞机的博客-CSDN博客

mysql分片的几种分配策略 - 固定、动态、固动结合、显示分配等_xxx_520s的博客-CSDN博客

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值