【数据库】为什么要分库分表

为什么要分库分表

  • 1.为什么要分库分表?
  • 2.垂直拆分
  • 3.水平拆分
  • 4.总结
    • 4.1 逻辑库和物理库
    • 4.2 逻辑表和物理表

1.为什么要分库分表?

随着近些年信息化大跃进,各行各业无纸化办公产生了大量的数据,而越来越多的数据存入了数据库中。当使用 MySQL 数据库的时候,单表超出了 2000 万数据量就会出现性能上的分水岭。并且物理服务器的 CPU、内存、存储、连接数等资源有限,某个时段大量连接同时执行操作,会导致数据库在处理上遇到性能瓶颈。为了解决这个问题,行业先驱们充分发扬了分而治之的思想,对大表进行分割,然后实施更好的控制和管理,同时使用多台机器的 CPU、内存、存储,提供更好的性能。而分而治之则有两种方式:垂直拆分水平拆分

2.垂直拆分

垂直拆分分为 垂直分库垂直分表。先说说 垂直分库。垂直分库其实是一种简单逻辑分割。比如我们的数据库中有商品表 Products、还有对订单表 Orders,还有积分表 Scores。接下来我们就可以创建三个数据库,一个数据库存放商品,一个数据库存放订单,一个数据库存放积分。如下图所示:

在这里插入图片描述
垂直分库 有一个优点,他能够根据业务场景进行孵化,比如某一单一场景只用到某 2、3 张表,基本上应用和数据库可以拆分出来做成相应的服务。

再来说说 垂直分表,比较适用于那种字段比较多的表,假设我们一张表有 100 个字段,我们分析了一下当前业务执行的 SQL 语句,有 20 个字段是经常使用的,而另外 80 个字段使用比较少。这样我们就可以把 20 个字段放在主表里面,我们在创建一个辅助表,存放另外 80 个字段。当然主表和辅助表都是有主键的。他们通过主键进行关联合并,就可以凑成 100 个字段的表。
在这里插入图片描述
垂直分表 可以解决跨页的问题。在 Oracle 中叫行链接。怎么理解呢?就是你字段少的情况下,原本一行数据只需要存在一个页里面就行了,但是字段多的情况就存不下了,就需要跨页。这样就会造成额外寻址,造成性能上的开销。另外将这么长的一行数据载到内存中,往往是几个页面,结果咱们经常只访问其中的几个字段,对内存也是一个极大的开销。所以为了让内存缓存更多数据,减少磁盘 I/O,垂直分表 就是很好的手段。

总体来说:垂直拆分 有以下优点:

  • ✅ 跟随业务进行分割,和最近流行的微服务概念相似,方便解耦之后的管理及扩展。
  • ✅ 高并发的场景下,垂直拆分使用多台服务器的 CPU、I/O、内存能提升性能,同时对单机数据库连接数、一些资源限制也得到了提升。
  • ✅ 能实现冷热数据的分离。

垂直拆分的缺点:

  • ⭕ 部分业务表无法 join,应用层需要很大的改造,只能通过聚合的方式来实现。增加了开发的难度。
  • ⭕ 当单库中的表数据量增大的时候依然没有得到有效的解决。
  • ⭕ 分布式事务也是一个难题。

3.水平拆分

当某张表数据量达到一定的程度的时候,前面曾说过 MySQL 单表出现 2000 万以上数据就会出现性能上的分水岭。此时发现没有办法根据业务规则再进行拆分了,就会导致单库上的读写性能出现瓶颈。此时就只能进行水平拆分了。

水平拆分又分为 库内分表分库分表。先说说 库内分表。假设当我们的 Orders 表达到了 5000 万行记录的时候,非常影响数据库的读写效率,怎么办呢?我们可以考虑按照订单编号的 order_id 进行 range 分区,就是把订单编号在 1 - 1000 万的放在 order1 表中,将编号在 1000 万 - 2000 万的放在 order2 中,以此类推,每个表中存放 1000 万数据。如下图所示:
在这里插入图片描述
虽然我们可以通过 库内分表 把单表的容量固定在 1000 万,但是这些表的数据仍然存放在一个库内,使用的是该主机的 CPU、IO、内存。单库的连接数也有限制。并不能完全的降低系统的压力。此时,我们就要考虑另外一种技术叫 分库分表。分库分表在库内分表的基础上,将分的表挪动到不同的主机和数据库上。可以充分的使用其他主机的 CPU、内存和 I/O 资源。并且分库之后,单库的连接数限制也不在成为瓶颈。但是 “成也萧何败也萧何”,如果你执行一个扫描不带分片键,则需要在每个库上查一遍。刚刚我们按照 order_id 分成了 5 个库,但是我们查询是 name='AAA' 的条件并且不带 order_id 字段时,它并不知道在哪个分片上查,则会创建 5 个连接,然后每个库都检索一遍。这种广播查询则会造成连接数增多。因为它需要在每个库上都创立连接。如果是高并发的系统,执行这种广播查询,系统的 thread 很快就会告警。
在这里插入图片描述
总体来说:水平拆分 的优点有以下:

  • ✅ 水平扩展能无线扩展。不存在某个库某个表过大的情况。
  • ✅ 能够较好的应对高并发,同时可以将热点数据打散。
  • ✅ 应用侧的改动较小,不需要根据业务来拆分。

水平拆分 的缺点:

  • ⭕ 路由是个问题,需要增加一层路由的计算,而且像前面说的一样,不带分片键查询会产生广播 SQL。
  • ⭕ 跨库 join 的性能比较差。
  • ⭕ 需要处理分布式事务的一致性问题。

4.总结

当前我们的系统,垂直拆分水平拆分 都在使用,垂直拆分主要是做业务上的分割,把业务的各个子系统都规划好,能解耦就解耦。而垂直拆分之后。我们再做水平分库分表。通过取模算法将大表数据拆到若干个库中。

4.1 逻辑库和物理库

介绍了上述的分库分表,我们有必要说一下几个概念,一个是 逻辑库物理库 的概念。我们还是拿水平拆分中的分库分表来说。我们在物理层面,将一个库的数据分割到了 5 个数据库中。这 5 个数据库就是物理库,而它们对上层应用的展现则是一个库。这个对上层展现的库就叫逻辑库。逻辑库对应用层是透明的。应用不需要了解底层的情况,直接使用就行了。

4.2 逻辑表和物理表

还是拿水平拆分中的分库分表来说,orders 表总共被分成了 5 份,分别在底层是 orders_1 - orders_5。这底层的 5 个表就是物理表。但是对应用层面来说,只有 orders 表。这就是逻辑表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/305623.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—1572.矩阵对角线元素的和【简单】

2023每日刷题&#xff08;七十三&#xff09; Leetcode—1572.矩阵对角线元素的和 实现代码 class Solution { public:int diagonalSum(vector<vector<int>>& mat) {int n mat.size();if(n 1) {return mat[0][0];}int sum 0;int i 0, j n - 1;while(i &…

Leetcode 763 划分字母区间

题意理解&#xff1a; 要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 输入&#xff…

Java——值得收藏的Java final修饰符总结!!!

Java final修饰符总结 一、final修饰类二、final修饰方法三、final修饰变量 总结 算下刚转Java到现在也有三个多月了&#xff0c;所以打算对Java的知识进行汇总一下&#xff0c;本篇文章介绍一下Java的final修饰符的作用&#xff0c;final表示最后的、最终的含义&#xff0c;fi…

硅像素传感器文献调研(三)

写在前面&#xff1a; 引言&#xff1a;也是先总结前人的研究结果&#xff0c;重点论述其不足之处。 和该方向联系不大&#xff0c;但还是有值得学习的地方。逻辑很清晰&#xff0c;易读性很好。 1991年—场板半阻层 使用场板和半电阻层的高压平面器件 0.摘要 提出了一种…

没错,这条短视频烂尾了

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 “你这个太标题党了&#xff0c;后悔点进去了” “松哥&#xff0c;下次增加点故事情节” “你这是哪是沉浸式&#xff0c;你这是自嗨啊” “那你这拍了个寂寞” “这视频&#xff0c;开头可以&#xff0c;烂尾了” …

如何从 DSA 切换到 PMax 以使您的 Google 付费广告面向未来

为了在 Google Ads 不可避免的过渡期之前&#xff0c;我们将介绍如何从动态搜索广告切换到效果最大化广告 如何从 DSA 切换到 PMax 以使您的 Google 付费广告面向未来 变化是唯一不变的&#xff0c;尤其是在数字广告中——您可能听说过一些关于动态搜索广告 &#xff08;DSA&…

webstorm中直接运行ts(TypeScript)

参考&#xff1a;https://www.cnblogs.com/yangfanjie/p/12036118.html 1&#xff1a;安装ts: npm install -g typescript 2&#xff1a;安装直接运行所需依赖包&#xff1a; npm install -g ts-node 3&#xff1a;在设置中安装安装插件后重启 4&#xff1a;重启后就会发现在…

高效编写测试用例

本话题暂不探讨是否有必要编写详细的测试用例&#xff0c;在确定要交付详细的测试用例这个前提下&#xff0c;分享如何更高效地完成测试用例的编写。 对齐测试用例需求 首先、明确要完成的测试用例文档目标要求&#xff0c;模板、范围、粒度等。 用例文档使用者&#xff1a;…

github登录需要双因素认证(Two-factor authentication)

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 github登录需要双因素认证&#xff08;Two-factor authentication&#xff09; 今天登录github发现需要绑定双因素才能够登录 我们…

提升设计效率:全面了解如何使用Figma插件

Figma组件库包括颜色、字体、图标、按钮、阴影、圆角、间距等。当Figma组件库的样式和Figma组件达到一定数量时&#xff0c;将难以维护&#xff0c;设计和开发的对接成本将大大提高。Figma可以在同一母版下单独设置样式&#xff0c;而不影响与母版之前的关系&#xff0c;这是Sk…

基于ssm兰亭序图书管理系统论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

在微服务中如何实现全链路的金丝雀发布?

目录 1. 什么金丝雀发布&#xff1f;它有什么用&#xff1f; 2.如何实现全链路的金丝雀发布 2.1 负载均衡模块 2.2 网关模块 2.3 服务模块 2.3.1 注册为灰色服务实例 2.3.2 设置负载均衡器 2.3.3 传递灰度发布标签 2.4 其他代码 2.4.1 其他业务代码 2.4.2 pom.xml 关…