【Mycat2实战】四、Mycat实现分库分表【概念篇】

1. 什么是分库分表

首先,我们需要知道**所谓"分库分表",根本就不是一件事儿,而是三件事儿,**他们要解决的问题也都不一样。

这三个事儿分别是"只分库不分表"、“只分表不分库”、以及"既分库又分表"。

分库:就是一个数据库分成多个数据库,部署到不同机器。

image-20231115170705217

分表:就是一个数据库表分成多个表。

image-20231115170740030

2. 为什么需要分库分表

2.1 为什么需要分库呢?

如果业务量剧增,数据库可能会出现性能瓶颈,这时候我们就需要考虑拆分数据库。从这几方面来看:

  • 磁盘存储

业务量剧增,MySQL单机磁盘容量会撑爆,拆成多个数据库,磁盘使用率大大降低。

  • 并发连接支撑

我们知道数据库连接是有限的。在高并发的场景下,大量请求访问数据库,MySQL单机是扛不住的!当前非常火的微服务架构出现,就是为了应对高并发。它把订单、用户、商品等不同模块,拆分成多个应用,并且把单个数据库也拆分成多个不同功能模块的数据库(订单库、用户库、商品库),以分担读写压力。

2.2 为什么需要分表?

数据量太大的话,SQL的查询就会变慢。如果一个查询SQL没命中索引,千百万数据量的表可能会拖垮这个数据库。

即使SQL命中了索引,如果表的数据量超过一千万的话,查询也是会明显变慢的。这是因为索引一般是B+树结构,数据千万级别的话,B+树的高度会增高,查询就变慢啦。

小伙伴们是否还记得,MySQL的B+树的高度怎么计算的呢? 顺便复习一下吧

InnoDB存储引擎最小储存单元是页,一页大小就是16k。B+树叶子存的是数据,内部节点存的是键值+指针。索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中,进而再去数据页中找到需要的数据,B+树结构图如下:

image-20231115170803772

假设B+树的高度为2的话,即有一个根结点和若干个叶子结点。这棵B+树的存放总记录数为=根结点指针数*单个叶子节点记录行数。

  • 如果一行记录的数据大小为1k,那么单个叶子节点可以存的记录数 =16k/1k =16.
  • 非叶子节点内存放多少指针呢?我们假设主键ID为bigint类型,长度为8字节(面试官问你int类型,一个int就是32位,4字节),而指针大小在InnoDB源码中设置为6字节,所以就是 8+6=14 字节,16k/14B =16*1024B/14B = 1170

因此,一棵高度为2的B+树,能存放1170 * 16=18720条这样的数据记录。

同理一棵高度为3的B+树,能存放1170 *1170 *16 =21902400,大概可以存放两千万左右的记录。B+树高度一般为1-3层,如果B+到了4层,查询的时候会多查磁盘的次数,SQL就会变慢。

因此单表数据量超过千万,就需要考虑分表啦。

3. 如何分库分表

3.1 垂直拆分

image-20231115170901758

3.1.1 垂直分库

在业务发展初期,业务功能模块比较少,为了快速上线和迭代,往往采用单个数据库来保存数据。数据库架构如下:

image-20231115170956397

但是随着业务蒸蒸日上,系统功能逐渐完善。这时候,可以按照系统中的不同业务进行拆分,比如拆分成用户库、订单库、积分库、商品库,把它们部署在不同的数据库服务器,这就是垂直分库

垂直分库,将原来一个单数据库的压力分担到不同的数据库,可以很好应对高并发场景。数据库垂直拆分后的架构如下:

image-20231115171107605

3.1.2 垂直分表

如果一个单表包含了几十列甚至上百列,管理起来很混乱,每次都select *的话,还占用IO资源。这时候,我们可以将一些不常用的、数据较大或者长度较长的列拆分到另外一张表。

比如一张用户表,它包含user_id、user_name、mobile_no、age、email、nickname、address、user_desc,如果email、address、user_desc等字段不常用,我们可以把它拆分到另外一张表,命名为用户详细信息表。这就是垂直分表

image-20231115171138251

3.2 水平拆分

3.2.1 水平分库

水平分库是指,将表的数据量切分到不同的数据库服务器上,每个服务器具有相同的库和表,只是表中的数据集合不一样。它可以有效的缓解单机单库的性能瓶颈和压力。

用户库的水平拆分架构如下:

image-20231115171217484

3.2.2 水平分表

如果一个表的数据量太大,可以按照某种规则(如hash取模、range),把数据切分到多张表去。

一张订单表,按时间range拆分如下:

image-20231115171242053

3.3. 水平分库分表策略

分库分表策略一般有几种,使用与不同的场景:

  • range范围
  • hash取模
  • range+hash取模混合
3.3.1 range范围

range,即范围策略划分表。比如我们可以将表的主键,按照从0~1000万的划分为一个表,1000~2000万划分到另外一个表。如下图:

image-20231115171325013

当然,有时候我们也可以按时间范围来划分,如不同年月的订单放到不同的表,它也是一种range的划分策略。

这种方案的优点:

  • 这种方案有利于扩容,不需要数据迁移。假设数据量增加到5千万,我们只需要水平增加一张表就好啦,之前0~4000万的数据,不需要迁移。

缺点:

  • 这种方案会有热点问题,因为订单id是一直在增大的,也就是说最近一段时间都是汇聚在一张表里面的。比如最近一个月的订单都在1000万~2000万之间,平时用户一般都查最近一个月的订单比较多,请求都打到order_1表啦,这就导致表的数据热点问题。
3.3.2 hash取模

hash取模策略:指定的路由key(一般是user_id、订单id作为key)对分表总数进行取模,把数据分散到各个表中。

比如原始订单表信息,我们把它分成4张分表:

image-20231115171427061

  • 比如id=1,对4取模,就会得到1,就把它放到第1张表,即t_order_0;
  • id=3,对4取模,就会得到3,就把它放到第3张表,即t_order_2;

这种方案的优点:

  • hash取模的方式,不会存在明显的热点问题。

缺点:

  • 如果一开始按照hash取模分成4个表了,未来某个时候,表数据量又到瓶颈了,需要扩容,这就比较棘手了。比如你从4张表,又扩容成8张表,那之前id=5的数据是在(5%4=1,即第一张表),现在应该放到(5%8=5,即第5张表),也就是说历史数据要做迁移了
3.3.3 range+hash取模混合

既然range存在热点数据问题,hash取模扩容迁移数据比较困难,我们可以综合两种方案一起嘛,取之之长,弃之之短。

比较简单的做法就是,在拆分库的时候,我们可以先用range范围方案,比如订单id在04000万的区间,划分为订单库1,id在4000万8000万的数据,划分到订单库2,将来要扩容时,id在8000万~1.2亿的数据,划分到订单库3。然后订单库内,再用hash取模的策略,把不同订单划分到不同的表。

image-20231115171458285

4. 什么时候才考虑分库分表呢?

4.1 什么时候分表?

如果你的系统处于快速发展时期,如果每天的订单流水都新增几十万,并且,订单表的查询效率明变慢时,就需要规划分库分表了。一般B+树索引高度是2~3层最佳,如果数据量千万级别,可能高度就变4层了,数据量就会明显变慢了。不过业界流传,一般500万数据就要考虑分表了。

4.2 什么时候分库

业务发展很快,还是多个服务共享一个单体数据库,数据库成为了性能瓶颈,就需要考虑分库了。比如订单、用户等,都可以抽取出来,新搞个应用(其实就是微服务思想),并且拆分数据库(订单库、用户库)。

5. 分库分表会导致哪些问题

分库分表之后,也会存在一些问题:

  • 事务问题
  • 跨库关联
  • 排序问题
  • 分页问题
  • 分布式ID

5.1 事务问题

分库分表后,假设两个表在不同的数据库,那么本地事务已经无效啦,需要使用分布式事务了。

5.2 跨库关联

跨节点Join的问题:解决这一问题可以分两次查询实现

5.3 排序问题

跨节点的count,order by,group by以及聚合函数等问题:可以分别在各个节点上得到结果后在应用程序端进行合并。

5.4 分页问题

  • 方案1:在个节点查到对应结果后,在代码端汇聚再分页。
  • 方案2:把分页交给前端,前端传来pageSize和pageNo,在各个数据库节点都执行分页,然后汇聚总数量前端。这样缺点就是会造成空查,如果分页需要排序,也不好搞。

5.5 分布式ID

据库被切分后,不能再依赖数据库自身的主键生成机制啦,最简单可以考虑UUID,或者使用雪花算法生成分布式ID。

6. 分库分表中间件

目前流行的分库分表中间件比较多:

image-20231113175008856

7. 本系列文章

本系列文章持续更新中,包括Mycat搭建,读写分离,分库分表等,敬请期待。

后续更新完成统一维护链接,占个坑先…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于WhatsApp群发营销价值、类型、优劣势……这里一次性讲清楚

01 社交销售互动:全球营销新趋势 当下,全球品牌的营销销售互动都步入了社交销售新时代,相比原来任何一种形式的互动沟通来说,其沟通效率、体验、效果都是无与伦比的。 企业与销售的互动,与通讯信息技术发展息息相关。…

PHP/Lerv通过经纬度计算距离获取附近商家

实际开发中,常常需要获取用户附近的商家,思路是 获取用户位置(经纬度信息)在数据库中查询在距离范围内的商家 注: 本文章内计算距离所使用地球半径统一为 6378.138 km public function mpa_list($latitude,$longitude,$distance){// $latitude 34.306465;// $longitude 10…

基于SpringBoot+Mybatis plus+React.js实现条件选择切换搜索功能

笔记/朱季谦 在写React前端逻辑时,经常遇到可以切换不同条件的列表查询功能,例如下边截图这样的,其实,这块代码基本都一个逻辑,可以一次性将实现过程记录下来,待以后再遇到时,直接根据笔记复用…

阿里云4核8G服务器优惠价格表,最低价格501.90元6个月、983.80元1年

阿里云4核8G服务器优惠价格表,云服务器ECS计算型c7实例4核8G配置3M带宽40GB ESSD云盘(系统盘)叠加使用优惠券后价格501.90元6个月、983.80元1年,现在购买经济型e、通用算力型u1、计算型c7和计算型c8a与c8i实例4核8G配置均有优惠&a…

怎么查看虚拟机的网关

1、点击编辑,再选择虚拟网络编辑器 2、选择VMnet8,点击NAT设置 3、查看网关IP

互联网行业以前是以前,现在是现在

目前互联网行业呈现出多个趋势与现状: 移动互联网普及:随着智能手机的普及,移动互联网已经成为主流,各种APP带来更加方便的服务,这也意味着PC端的互联网服务逐渐被取代。 数字化转型:各个行业都在进行数…

腾讯云轻量数据库试用初体验

腾讯云轻量数据库1核1G开箱测评,轻量数据库服务采用腾讯云自研的新一代云原生数据库TDSQL-C,轻量数据库兼100%兼容MySQL数据库,实现超百万级 QPS 的高吞吐,128TB海量分布式智能存储,虽然轻量数据库为单节点架构&#x…

【Go语言实战】(26) 分布式搜索引擎

Tangseng 基于Go语言的搜索引擎 github地址:https://github.com/CocaineCong/tangseng 详细介绍地址:https://cocainecong.github.io/tangseng 这两周我也抽空录成视频发到B站的~ 本来应该10月份就要发了,结果一鸽就鸽到现在hh…

安全知识普及:了解端点检测与响应 (EDR)对企业的重要性

文章目录 EDR 的含义和定义EDR 是如何运作的?收集端点数据将数据发送到 EDR 平台分析数据标记可疑活动并做出响应保留数据以供日后使用 为什么 EDR 对企业至关重要大多数企业都有可能遭受各种网络攻击。有些攻击可以完全绕开企业的防御远程办公让员工缺乏足够的保护…

EOCR电机保护器的日常维护与保养技巧

EOCR是由施耐德韩国公司生产的电动机保护系列产品,由电子器件和互感器等部件组成,在正常状态下使用都有各自的机械寿命和电气寿命,若操作不当或异常条件下会加速电器元件的老化,缩短保护器的使用寿命,所以电机保护器的正确使用和正…

如何安装运行Wagtail,并结合cpolar内网穿透实现公网访问网站界面

Wagtail-基于Python Django的内容管理系统CMS实现公网访问 文章目录 Wagtail-基于Python Django的内容管理系统CMS实现公网访问前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个…

openCV教程(三)

文章目录 1 车辆统计项目1.1 背景减除1.2 车辆统计2 特征点检测和匹配2.1 harris角点检测2.2 shi-tomasi角点检测2.3 SIFT关键点检测2.4 SURF特征检测2.5 ORB特征检测3 特征匹配3.1 暴力特征匹配3.2 FLANN特征匹配3.3 图像查找3.3.1 单应性矩阵4 模版匹配4.1 模版匹配4.2 匹配多…

Mybatis和MybatisPlus:数据库操作工具的对比

目录 什么是mybatis 什么是mybatisplus MyBatis-Plus:为简化数据库操作而生的强大工具 一、MyBatis-Plus的背景和概述 二、MyBatis-Plus的主要特点 三、如何使用MyBatis-Plus mybatis-Plus的优势 什么是Hibernate Hibernate:Java开发者的数据持久…

数字化转型的终局

(1)数字化转型 我手头有一本书叫《提升》,是IBM市场部所属的商业价值研究院在2011年出版的图书。 在书的第三章《数字化转型》一章中第68页提出了”数字化转型“能力: 1、业务模式创新-客户和社区协作-跨渠道整合-数字化供应链 2、…

人工智能的广泛应用与影响

目录 前言1 智能手机与个人助手2 医疗保健3 自动驾驶技术4 金融领域5 教育与学习6 智能家居与物联网7 娱乐与媒体8 环境保护结语 前言 人工智能(Artificial Intelligence,AI)是当今科技领域的璀璨明星,它不仅在技术创新方面掀起了…

【机器学习】036_权重衰退

一、范数 定义:向量的范数表示一个向量有多大(分量的大小) L1范数: 即向量元素绝对值之和,用符号 ‖ v ‖ 1 表示。 公式: L2范数: 即向量的模,向量各元素绝对值的平方之和再…

基于springboot实现智能热度分析和自媒体推送平台系统项目【项目源码】计算机毕业设计

基于springboot实现智能热度分析和自媒体推送平台演示 系统开发平台 在该自媒体分享网站中,Eclipse能给用户提供更多的方便,其特点一是方便学习,方便快捷;二是有非常大的信息储存量,主要功能是用在对数据库中查询和编…

如果在手机没有root的情况下完成安卓手机数据恢复

您是否不小心从安卓设备中删除了重要数据? 担心如何取回您的照片、视频和文档? 有时您可能会不小心删除重要数据并使用安卓 root方法取回文件。 许多用户不喜欢根植他们的安卓设备,因为这是一种复杂的方法。 在本指南中,我们将向您…

【寒武纪(10)】linux arm aarch 是 opencv 交叉编译与使用

文章目录 1、直接找github 别人编译好的2、自主编译参考 3使用CMake检查 参考 1、直接找github 别人编译好的 测试很多,找到一个可用的。 https://github.com/dog-qiuqiu/libopencv 它用了超级模块! OpenCV的world模块也称为超级模块(supe…

【Java基础】Java导Excel攻略

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…