MySQL分库分表,何时分?怎么分?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: MySQL分库分表,何时分?怎么分?

🍁 一、 数据库中间件


1ccad50f417a451fa7e61b8832d263ed.png


1.Cobar 属于阿里 B2B 事业群,始于 2008 年,在阿里服役 3 年多,
接管 3000+个 MySQL 数据库的 schema,集群日处理在
线 SQL请求 50 亿次以上。由于 Cobar 发起人的离职,Cobar停止维护。
2.Mycat 是开源社区在阿里 Cobar 基础上进行二次开发,
解决了 cobar 存在的问题,并且加入了许多新的功能在其中。青出于蓝而胜于蓝。
3.OneProxy基于 MySQL官方的 proxy思想利用 c进行开发的,
OneProxy是一款商业收费的中间件。舍弃了一些功能,专注在性能和稳定性上。
4.kingshard 由小团队用 go 语言开发,还需要发展,需要不断完善。
5.Vitess 是 Youtube生产在使用,架构很复杂。不支持 MySQL原生协议,使用需要大量改造成本。
6.Atlas 是 360 团队基于 MySQL proxy改写,功能还需完善,高并发下不稳定。
7. MaxScale是 mariadb(MySQL原作者维护的一个版本)研发的中间件。
8. MySQL Route是 MySQL官方 Oracle公司发布的中间件。


🍁 二、 分库分表简介



    MySQL 作为互联网公司都会用到的数据库,如果在使用过程中出现性能问题,
    会采用 mysql 的横向扩展,使用主从复制来提高读性能,要是解决写入问题,需要进行分库分表。
    分库分表是业务发展到一定阶段,数据积累到一定量级而衍生出来的解决方案。
    当 DB 的数据量级到达一个阶段, 写入和读取的速度会出现瓶颈,即使是有索引,索引也会变的很大,
    而且数据库的物理文件大的会使备份和恢复等操作变的很困难。
    这个时候由于 DB 的瓶颈已经严重危害到了业务,最有效的解决方案莫过于DB的分库分表了。
    数据库表的拆分解决的问题主要是存储和性能问题,mysql 在单表数据量达到一定量级后,
    性能会急剧下降,相比较于sqlserver 和 Oracle 这些收费 DB 来说,
    mysql 在某些方面还是处于弱势,但是表的拆分这个策略却适用于几乎所有的关系型数据库。


🍃 2.1 、分库分表的目的


分库分表就是为了 解决由于数据量过大而导致数据库性能降低的问题,
  将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,
  使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。


🍃 2 2 、分库分表标准


存储占用 100G+

数据增量每天 200w+

单表条数 1 亿条+


🍃 2.3、类型


① 分库:垂直分库、水平分库

② 分表:垂直分表、水平分表

分库是指把一个数据库拆分为多个数据库,一般分为垂直分库和水平分库。

分表指的是通过一定规则,将一张表分解成多张不同的表,一般分为垂直分表和水平分表。


a、垂直分库

4ab66b094ffe47ffad78b37ad4fc7321.png

1 、概念:垂直分库以 表为依据,按照业务归属不同,将不同的表拆分到不同的业务库中。
每个库可以放在不同的服务器上,核心理念是专库专用。
2 、结果:垂直分库的结果是
每个库的表结构都不一样;
每个库的数据也不一样,没有交集;
所有库的并集是全量数据。
3 、场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块。
4 、分析:到这一步,基本上就可以服务化了。
例如,随着业务的发展一些公用的配置表、字典表等越来越多,这时可以将这
些表拆到单独的库中,甚至可以服务化。
再有,随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。

b 、水平分库

5f4e5be15991445685c2970e644e1917.png


1 、概念:水平分库是以字段为依据,按照一定策略(hash、range 等),
将一个库中的数据拆分到多个库中。
2 、结果:水平分库的结果是
每个库的结构都一样;
每个库的数据都不一样,没有交集;
所有库的并集是全量数据。
3 、场景:系统绝对并发量上来了,
分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。
4 、分析:库多了,IO 和 CPU 的压力自然可以成倍缓解。

c、垂直分表


fd5d7b702f364cfbb3b8bd0f1c4eb9a9.png


1 、概念:垂直分表即“宽表拆窄表”,以 字段为依据,
按照 字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。
垂直分表一般是表中的字段较多,将冗余字段,不常用字段,
数据较大,长度较长(例如 text 类型字段)的拆分到“扩展表“。
一般是针对那种几百列的宽表,也可以避免在查询时,数据量太大造成的“跨页”问题。
2 、结果:垂直分表的结果是
每个表的结构都不一样;
每个表的数据也不一样,一般来说,每个表的字段至少有一列交集,一般是主键,用于关联数据;
所有表的并集是全量数据。
3 、场景:系统绝对并发量并没有上来,表的记录并不多,
但是字段多,并且热点数据和非热点数据在一起,单行数据所需的
存储空间较大。以至于数据库缓存的数据行减少,查询时会去读磁盘数据产生大量的随机读 IO,产生 IO 瓶颈。
4 、分析:可以用列表页和详情页来帮助理解。
垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,
非热点数据放在一起作为扩展表。这样更多的热点数据就能被缓存下来,进而减少了随机读 IO。
拆了之后,要想获得全部数据就需要关联两个表来取数据。但记住,千万别用 join,
因为 join 不仅会增加 CPU 负担并且会讲两个表耦合在一起(必须在一个数据库实例上)。
关联数据,应该在业务 Service 层做文章,分别获取主表和扩展表数据然后用关联字段关联得到全部数据。


97b0a2cc6f4c4aaab213c55538ecb312.png

      垂直分表,比较适用于那种字段比较多的表,假设我们一张表有 100 个字段,
      我们分析了一下当前业务执行的 SQL 语句,有20 个字段是经常使用的,而另外 80 个字段使用比较少。
      这样我们就可以把 20 个字段放在主表里面,我们在创建一个辅助表,存放另外 80 个字段。
      当然主表和辅助表都是有主键的。他们通过主键进行关联合并,就可以凑成 100 个字段的表。
      通常我们按以下原则进行垂直拆分:
      1)把不常用的字段单独放在一张表;
      2)把 text,blob 等大字段拆分出来放在附表中;
    3)经常组合查询的列放在一张表中;

d 、水平分表(库内分表)


3f13cab8c07142f9b3a994a84e29b6a1.png

概念:水平分表是以字段为依据,按照一定策略(hash、range 等),
将一个表中的数据拆分到多个表中,也称为库内分表。
结果:水平分表的结果是
①每个表的结构都一样;
②每个表的数据都不一样,没有交集;
③所有表的并集是全量数据。
场景:系统绝对并发量并没有上来,只是单表的数据量太多,
影响了 SQL 效率,加重了 CPU 负担,以至于成为瓶颈。
分析:表的数据量少了,单次 SQL 执行效率高,自然减轻了 CPU 的负担。


🍁 三、分库分表总结



🍃 3.1 垂直拆分优点:


1)跟随业务进行分割,和最近流行的微服务概念相似,方便解耦之后的管理及扩展。

2)高并发的场景下,垂直拆分使用多台服务器的 CPU、I/O、

内存能提升性能,同时对单机数据库连接数、一些资源限制也得到了提升。

3)能实现冷热数据的分离。


🍃 3.2 水平拆分的优点


水平扩展能无线扩展。不存在某个库某个表过大的情况。

能够较好的应对高并发,同时可以将热点数据打散。

应用侧的改动较小,不需要根据业务来拆分。


分库分表的顺序应该是先垂直分,后水平分,先垂直分表,再垂直分库,再水平分库,最后水平分表。因为垂直分更简单,更符合人们处理现实世界问题的方式。


🍃 3.2 分库分表和表分区的区别


表分区(Partitioning)可以将一张表的数据分别存储为多个文件。

如果在写 SQL 的时候,遵从了分区规则,

那么就能把原本需要遍历全表的工作转变为只需要遍历表里某一个或某些分区的工作。

这样降低了查询对服务器的压力,提升了查询效率。如果分区表使用得当,

那么也可以大规模地提升 MySQL 的服务能力。

但是这种分区方式,一方面,在使用的时候必须遵从分区规则写 SQL语句,

如果不符合分区规则,那么性能反而会非常低下;另一方面,分区的结果受到 MySQL 实例,

或者说 MySQL 单实例的数据文件无法分布式存储的限制,不管怎么分区,

所有的数据还是都在一个服务器上,没办法通过水平扩展物理服务的方法把压力分摊出去。

分表与分区的区别在于:分区一般都是放在单机里的,

从逻辑上来讲只有一张表,是 MySQL 的一种内部实现;

而分表则是将一张表分解成多张表,分库分表需要代码实现。分库分表和分区并不冲突,可以结合使用。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
存储 SQL 关系型数据库
MySQL分库分表
MySQL分库分表
138 0
|
SQL 存储 关系型数据库
Mysql系列-5.Mysql分库分表(中)
Mysql系列-5.Mysql分库分表
126 0
|
4月前
|
关系型数据库 MySQL Java
MySQL 分库分表 + 平滑扩容方案 (秒懂+史上最全)
MySQL 分库分表 + 平滑扩容方案 (秒懂+史上最全)
|
8月前
|
关系型数据库 MySQL 数据库
|
存储 算法 关系型数据库
(二十二)全解MySQL之分库分表后带来的“副作用”一站式解决方案!
上篇《分库分表的正确姿势》中已经将分库分表的方法论全面阐述清楚了,总体看下来用一个字形容,那就是爽!尤其是分库分表技术能够让数据存储层真正成为三高架构,但前面爽是爽了,接着一起来看看分库分表后产生一系列的后患问题,注意我这里的用词,是一系列而不是几个,也就是分库分表虽然好,但你要解决的问题是海量的。
1094 3
|
10月前
|
Java 关系型数据库 MySQL
MySQL 分库分表方案
本文总结了数据库分库分表的相关概念和实践,针对单张表数据量过大及增长迅速的问题,介绍了垂直和水平切分的方式及其适用场景。文章分析了分库分表后可能面临的事务支持、多库结果集合并、跨库join等问题,并列举了几种常见的开源分库分表中间件。最后强调了不建议水平分库分表的原因,帮助读者在规划时规避潜在问题。
1020 20
|
10月前
|
关系型数据库 MySQL 中间件
MySQL 中如何实现分库分表?常见的分库分表策略有哪些?
在MySQL中,分库分表(Sharding)通过将数据分散到多个数据库或表中,以应对大量数据带来的性能和扩展性问题。常见策略包括:哈希分片(分布均匀,查询效率高)、范围分片(适合范围查询)、列表分片(适用于特定值查询)、复合分片(灵活性高)和动态分片(灵活应对负载变化)。每种策略各有优劣,需根据业务需求选择。常用工具如MyCAT、ShardingSphere和TDDL可简化实现过程。
|
NoSQL 关系型数据库 MySQL
实时计算 Flink版操作报错之同步MySQL分库分表500张表报连接超时,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
1693 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
SQL 算法 Java
(二十六)MySQL分库篇:Sharding-Sphere分库分表框架的保姆级教学!
前面《MySQL主从原理篇》、《MySQL主从实践篇》两章中聊明白了MySQL主备读写分离、多主多写热备等方案,但如果这些高可用架构依旧无法满足业务规模,或业务增长的需要,此时就需要考虑选用分库分表架构。
5546 4

推荐镜像

更多