分库分表的原理分析

介绍

通过一定的规则,如果按时间范围划分,根据hash取模、指定分片等算法,将数据量大的数据库拆分成多个单独数据库,将原本数据量大的表拆分成若干个数据表,使得单一的库、表性能达到最优的效果(响应速度快),以此提升整体数据库性能

为什么要分库分表?

分库
  1. 连接数
    服务连接数据库都使用了数据源这种池化的缓存方案,但每个数据库的连接数始终是有上限的,并发量突增时,很快就会将数据库的连接全部用掉,其他的请求就会失败

  2. 容量
    每台机器给数据库分配的磁盘容量是有限的,随着数据量的增加,依旧存在容量会被占满的问题

分表

分表最重要的作用是提高sql的执行效率
一旦表中的数据量很大的话,假如是一亿数据量,就算用上索引效率也不是很高,原因是 InnoDB 存储引擎,聚簇索引结构的 B+树的层级变高,磁盘 IO 变多查询性能变慢

垂直拆分(根据业务进行拆分)

垂直分库

按照不同的业务来拆分成多个库
垂直分库

垂直分表

适用于字段非常多的表
对于很多的查询来说,不需要一次将所有的字段全都查询出来,这样浪费性能,影响效率
可以将经常查询的字段单独拆分出一个表,将另外的字段单独拆分成另一个表,拆分后的表通过某个字段关联起来,这样既可以减少表的容量大小,又可以提升查询效率
垂直分表

使用注意问题

1. 分片键选择

分片键选择直接影响了整个分库分表的性能,如果分片键选择不当,可能会导致全路由查询,也就是将分库分表中的所有库和表都要路由一遍

  • 业务相关性:选择那些经常作为查询条件的字段作为分片键,可以减少跨分片的查询,提高查询效率。
  • 均匀分布数据:理想的分片键能够确保数据在各个分片间均匀分布,避免某些分片数据量过大而成为瓶颈。均匀的数据分布有助于负载均衡
  • 写入性能:在考虑分片键时,应考虑到写入操作的性能。一个好的分片键可以减少写入时的热点问题,避免某个分片因为频繁的写入操作而过载
  • 避免频繁修改:分片键一旦选择并开始使用后,修改起来将非常困难且成本很高
  • 避免业务操作跨分片:如果业务操作需要跨多个分片进行,可能会严重影响性能。因此,应尽可能选择可以将相关数据局部化的分片键,减少跨分片操作的需求
2. 查询问题

表中的id是分片键的最佳选择,但存在一个问题,比如搜索条件的分页查询,比如说查询职员列表,可根据 职员类型、所在部门、入职时间 这些条件查询列表,这些条件没有 职员id 的分片键,就会造成全路由的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值