mysql分库分表

1 分库分表是什么

  • 分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。
  • 分表:从单张表拆分成多张表的过程,将数据散落在多张表内。

2 分库分表有什么用

分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题

3 分库分表的方式

  • 分库分表包含分库和分表 两个部分,而这两个部分可以统称为数据分片,其目的都是将数据拆分成不同的存储单元。
  • 从分拆的角度上,可以分为垂直分片和水平分片

3.1 垂直分片

  • 按照业务来对数据进行分片,按照业务将表进行归类,分布到不同的数据库或表中,从而将压力分散至不同的数据库或表。
  • 如果垂直分片之后,表中的数据量依然超过单节点所能承载的阈值,则需要水平分片来进一步处理。

image-20230228221440881

3.2 水平分片

  • 又称横向分片。通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分

image-20230228221453079

3.2.1 水平分片常用的分片策略

  • 精准分片,比如:取余\取模 。 优点均匀存放数据,缺点 扩容非常麻烦,如果新加一台服务器,之前的老数据就得做迁移
  • 按照范围分片 : 当我们 SQL中的分片健字段用到 BETWEEN AND操作符会使用到此算法,比如订单id在1至100存放到一张表,200到300在另一张。

4 分库分表要解决哪些问题

  • 事务一致性问题

原本单机数据库有很好的事务机制能够帮我们保证数据一致性。但是分库分表后,由于数据分布在不同库甚至不同服务器,不可避免会带来分布式事务问题。

  • 跨节点关联查询问题

在没有分库时,我们可以进行很容易的进行跨表的关联查询。但是在分库后,表被分散到了不同的数据库,就无法进行关联查询了。这时就需要将关联查询拆分成多次查询,然后将获得的结果进行拼装。

  • 跨节点分页、排序函数

跨节点多库进行查询时,limit分页、order by排序等问题,就变得比较复杂了。需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序。这时非常容易出现内存崩溃的问题。

  • 主键避重问题

在分库分表环境中,由于表中数据同时存在不同数据库中,主键值平时使用的自增长将无用武之地,某个分区数据库生成的ID无法保证全局唯一。因此需要单独设计全局主键,以避免跨库主键重复问题。

  • 公共表处理

实际的应用场景中,参数表、数据字典表等都是数据量较小,变动少,而且属于高频联合查询的依赖表。这一类表一般就需要在每个数据库中都保存一份,并且所有对公共表的操作都要分发到所有的分库去执行。

  • 运维工作量

面对散乱的分库分表之后的数据,应用开发工程师和数据库管理员对数据库的操作都变得非常繁重。对于每一次数据读写操作,他们都需要知道要往哪个具体的数据库的分表去操作,这也是其中重要的挑战之一。

5 什么时候需要分库分表?

在阿里巴巴公布的开发手册中,建议MySQL单表记录如果达到500W这个级别,或者单表容量达到2GB,一般就建议进行分库分表。

6 常见的分库分表组件

ShardingSphere,mycat, DBLE


mysql分库分表
http://example.com/mysql分库分表/
作者
Panyurou
发布于
2022年9月22日
许可协议