学习笔记<二> MySQL学习(3):分库、分表
文章目录
- 为什么分库分表
- 一、垂直分片、水平分片
- 二、常用的数据分片策略
- 三、垂直分表、垂直分库、水平分库、水平分表
- 四、垂直切分、水平切分优缺点
- 五、数据分片规则
- 六、分库分表带来的问题
本文参考
博主「小Y是我的」的文章,原文链接:https://blog.csdn.net/m0_48383346/article/details/116999608
博主「勤天」的文章,原文链接:https://blog.csdn.net/demored/article/details/123371982
为什么分库分表
随着平台的业务发展,数据可能会越来越多,甚至达到亿级。以MySQL为例,单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而明显降低。单表的数据量超过1000w,性能也会下降严重。这就会导致查询一次所花的时间变长,并发操作达到一定量时可能会卡死,甚至把系统给拖垮
我们是否可以通过提升服务器硬件能力来提高数据处理能力?能,但是这种方案很贵,并且提高硬件是有上限的。那我们能不能把数据分散在不同的数据库中,使得单一数据库和表的数据量变小,从而达到提升数据库操作性能的目的? 可以,这就是数据库分库分表。
分库分表就是把较大的数据库和数据表按照某种策略进行拆分。目的在于:降低每个库、每张表的数据量,减小数据库的负担,提高数据库的效率,缩短查询时间。另外,因为分库分表这种改造是可控的,底层还是基于RDBMS,因此整个数据库的运维体系以及相关基础设施都是可重用的。
一、垂直分片、水平分片
垂直(纵向)分片:按照业务维度将表拆分到不同的数据库中,专库专用,分担数据库压力(提高IO性能)。
水平(横向)分片:按某种规则将单表数据拆分到多张表中。从理论上突破了单机数据量的瓶颈,是分库分表的标准解决方案。
- 垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低。相互影响非常小,业务逻辑非常清晰的系统。在这样的系统中,能够非常easy做到将不同业务模块所使用的表分拆到不同的数据库中。依据不同的表来进行拆分。对应用程序的影响也更小,拆分规则也会比較简单清晰。
- 水平切分于垂直切分相比。相对来说略微复杂一些。由于要将同一个表中的不同数据拆分到不同的数据库中,对于应用程序来说,拆分规则本身就较依据表名来拆分更为复杂,后期的数据维护也会更为复杂一些。
- 当我们某个(或者某些)表的数据量和访问量特别的大,通过垂直切分将其放在独立的设备上后仍然无法满足性能要求,这时候我们就必须将垂直切分和水平切分相结合。先垂直切分,然后再水平切分。才干解决这样的超大型表的性能问题。
二、常用的数据分片策略
- 取模分片:取模算法来分片,如:id%2=1的一起, id%2=0的一起
优点:数据存放比较均匀。
缺点:扩容需要大量数据迁移。 - 按范围分片
优点:扩容不需要迁移数据。
缺点:数据存放不均匀,容易产生数据倾斜。 - 根据业务场景,灵活定制分片策略。
三、垂直分表、垂直分库、水平分库、水平分表
垂直切分可以分为: 垂直分库和垂直分表,水平切分可以分为:水平分库和水平分表。
-
垂直分表:可以把一个宽表的字段按访问频次、业务耦合松紧、是否是大字段的原则拆分为多个表,这样既能使业务清晰,还能提升部分性能。拆分后,尽量从业务角度避免联查,否则性能方面将得不偿失。

说明:一开始商品表中包含商品的所有字段,但是我们发现:
(1)商品详情和商品属性字段较长。
(2)商品列表的时候我们是不需要显示商品详情和商品属性信息,只有在点进商品商品的时候才会展示商品详情信息。
所以可以考虑把商品详情和商品属性单独切分一张表,提高查询效率。 -
垂直分库:可以把多个表按业务耦合松紧归类,分别存放在不同的库,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能,同时能提高整体架构的业务清晰度,不同的业务库可根据自身情况定制优化方案。但是它需要解决跨库带来的所有复杂问题。

-
水平分库:可以把一个表的数据(按数据行)分到多个不同的库,每个库只有这个表的部分数据,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能。它不仅需要解决跨库带来的所有复杂问题,还要解决数据路由的问题。

-
水平分表:可以把一个表的数据(按数据行)分到多个同一个数据库的多张表中,每个表只有这个表的部分数据,这样做能小幅提升性能,它仅仅作为水平分库的一个补充优化。

一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案,在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库分表方案。
四、垂直切分、水平切分优缺点
- 垂直切分优缺点
-
优点:解决业务系统层面的耦合,业务清晰 - 与微服务的治理类似,也能对不同业务的数据进行分级管理、维护、监控、扩展等 - 高并发场景下,垂直切分一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈
-
缺点:分库后无法Join,只能通过接口聚合方式解决,提升了开发的复杂度 - 分库后分布式事务处理复杂 - 依然存在单表数据量过大的问题(需要水平切分)
- 水平切分优缺点
-
优点:不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力 - 应用端改造较小,不需要拆分业务模块
-
缺点:跨分片的事务一致性难以保证 - 跨库的Join关联查询性能较差 - 数据多次扩展难度和维护量极大
五、数据分片规则
我们我们考虑去水平切分表,将一张表水平切分成多张表,这就涉及到数据分片的规则,比较常见的有:
- Hash取模分表
- 数值Range分表
- 一致性Hash算法分表
- Hash取模分表
概念 一般采用Hash取模的切分方式,例如:假设按goods_id分4张表。(goods_id%4 取整确定表)

- 优点:数据分片相对比较均匀,不容易出现热点和并发访问的瓶颈。
- 缺点:后期分片集群扩容时,需要迁移旧的数据很难。 - 容易面临跨分片查询的复杂问题。
比如上例中,如果频繁用到的查询条件中不带goods_id时,将会导致无法定位数据库,从而需要同时向4个表发起查询,再在内存中合并数据,取最小集返回给应用,分库反而成为拖累。
- 数值Range分表
概念 按照时间区间或ID区间来切分。例如:将goods_id为11000的记录分到第一个表,10012000的分到第二个表,以此类推。

-
优点:单表大小可控 - 天然便于水平扩展,后期如果想对整个分片集群扩容时,只需要添加节点即可,无需对其他分片的数据进行迁移 - 使用分片字段进行范围查找时,连续分片可快速定位分片进行快速查询,有效避免跨分片查询的问题。
-
缺点: 热点数据成为性能瓶颈。
例如:按时间字段分片,有些分片存储最近时间段内的数据,可能会被频繁的读写,而有些分片存储的历史数据,则很少被查询
- 一致性Hash算法
一致性Hash算法能很好的解决因为Hash取模而产生的分片集群扩容时,需要迁移旧的数据的难题。
六、分库分表带来的问题
分库分表有效的缓解了大数据、高并发带来的性能和压力,也能突破网络IO、硬件资源、连接数的瓶颈,但同时也带来了一些问题。
- 事务一致性问题
由于分库分表把数据分布在不同库甚至不同服务器,不可避免会带来分布式事务问题,我们需要额外编程解决该问题。 - 跨节点join
在没有进行分库分表前,我们检索商品时可以通过以下SQL对店铺信息进行关联查询:
SELECT p.*,s.[店铺名称],s.[信誉]
FROM [商品信息] p
LEFT JOIN [店铺信息] s ON p.id = s.[所属店铺]
WHERE...ORDER BY...LIMIT...
但经过分库分表后,**[商品信息]和[店铺信息]**不在一个数据库或一个表中,甚至不在一台服务器上,无法通过sql语句进行关联查询,我们需要额外编程解决该问题。
- 跨节点分页、排序和聚合函数
跨节点多库进行查询时,limit分页、order by排序以及聚合函数等问题,就变得比较复杂了。需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序。例如,进行水平分库后的商品库,按ID倒序排序分页,取第一页:

以上流程是取第一页的数据,性能影响不大,但由于商品信息的分布在各数据库的数据可能是随机的,如果是取第N页,需要将所有节点前N页数据都取出来合并,再进行整体的排序,操作效率可想而知,所以请求页数越大,系统的性能也会越差。
在使用Max、Min、Sum、Count之类的函数进行计算的时候,与排序分页同理,也需要先在每个分片上执行相应的函数,然后将各个分片的结果集进行汇总和再次计算,最终将结果返回。
- 主键避重
在分库分表环境中,由于表中数据同时存在不同数据库中,主键值平时使用的自增长将无用武之地,某个分区数据库生成的ID无法保证全局唯一。因此需要单独设计全局主键,以避免跨库主键重复问题。

由于分库分表之后,数据被分散在不同的服务器、数据库和表中。因此,对数据的操作也就无法通过常规方式完成,并且它还带来了一系列的问题。我们在开发过程中需要通过一些中间件解决这些问题,市面上有很多中间件可供我们选择,其中Sharding-JDBC和mycat较为流行。
相关文章:
学习笔记<二> MySQL学习(3):分库、分表
文章目录为什么分库分表一、垂直分片、水平分片二、常用的数据分片策略三、垂直分表、垂直分库、水平分库、水平分表四、垂直切分、水平切分优缺点五、数据分片规则六、分库分表带来的问题本文参考博主「小Y是我的」的文章,原文链接:https://blog.csdn.n…...
重生之我是赏金猎人-SRC漏洞挖掘(八)-记一次移花接木的GetShell
0x00:前言 https://github.com/J0o1ey/BountyHunterInChina 欢迎亲们点个star 作者:RGM78sec 某天测厂商业务时,发现其中有一个提供音乐播放业务的资产,正好里面有我想听的歌,于是就有了这篇文章 0x01:…...
离线数仓(五):数仓搭建
文章目录一、创建数据库二、ODS 层(原始数据层)三、DWD 层(明细数据层)3.1 get_json_object 函数使用3.2 启动日志表 DWD层创建四、DWS 层(服务数据层)五、DWT 层(数据主题层)六、AD…...
安装SQL Server2017 过程中报KB29119355失败的解决方案
SQLServer 2017脱机版下载地址:http://download.microsoft.com/download/6/4/A/64A05A0F-AB28-4583-BD7F-139D0495E473/SQLServer2017-x64-CHS-Dev.isoMicrosoft SQL Server Management Studio 18管理工具下载https://learn.microsoft.com/zh-cn/sql/ssms/download-…...
2023年浙江建筑特种工(施工升降机)真题题库及答案
百分百题库提供特种工(施工升降机)考试试题、特种工(施工升降机)考试预测题、特种工(施工升降机)考试真题、特种工(施工升降机)证考试题库等,提供在线做题刷题,在线模拟考…...
2023年进入互联网行业好找工作吗?
俗话说:选择大于努力。年后求职小高峰,大家在找工作的时候选择肯定也多了。说真,不是人人都有铁饭,普通家庭的孩子想要在2023年进入互联网行业去找工作可能吗?01有一点大家要清楚,2022年是进入过一个寒冬的…...
基于策略模式企业实战中策略命中设计
背景 在公司实际项目项目开发中,有一个策略命中的开发需求。根据用户请求参数的不同来动态返回不同的业务数据。比如说有城市、客户年龄、请求时间3个策略维度,不同的城市返回不同的地区的地标,根据时间地标的背景色要发生变化等等的需求。当…...
pod生命周期,pod控制器service
一:pod-demo.yml apiVersion: v1 # <string> kind: Pod # <string> metadata: # <Object>对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字…...
SAP FICO 深入讲解会计凭证
SAP系统在数据处理,无论是业务处理,还是财务处理都会产生大量的凭证,无论是什么凭证,最终的反映形式就是 会计凭证。 1.凭证原则Code 每笔记账都一直以凭证形式存储,每一凭证都作为前后一致的单位保留在系统中…...
LeetCode 2341. 数组能形成多少数对
【LetMeFly】2341.数组能形成多少数对 力扣题目链接:https://leetcode.cn/problems/maximum-number-of-pairs-in-array/ 给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤: 从 nums 选出 两个 相等的 整数从 nums…...
PHPStorm常用快捷键
alt 1 左侧项目结构树隐藏或者显示,这两个组合键的使用可以切换“项目结构树”和当前打开文件之间的焦点。 alt 2 隐藏或者显示 Favorites Ctrl Shift F12 切换到最大编辑器窗口,隐藏其他所有的工具窗口。例如项目结构树、Favorites、Terminal等。…...
【基于腾讯云的远程机械臂小车】
【基于腾讯云的远程机械臂小车】1. 项目来源1.1 项目概述1.2 系统结构1.3 设计原理2. 硬件搭建2.1 CH32V307开发板2.2 Arduino mega25602.3 富斯I6遥控器2.4 机械臂小车2.5 ESP8266 MCU2.5.1 ESP8266 MCU介绍2.5.2 腾讯云固件烧录3. 软件设计3.1 两种控制方式3.1.1 富斯I6遥控机…...
兼职任务平台收集(一)分享给有需要的朋友们
互联网时代,给人们带来了很大的便利。信息交流、生活缴费、足不出户购物、便捷出行、线上医疗、线上教育等等很多。可以说,网络的时代会一直存在着。很多人也在互联网上赚到了第一桶金,这跟他们的努力和付出是息息相关的。所谓一份耕耘&#…...
MarkDown中公式的编辑
MarkDown中公式的编辑生成目录积分插入编号常见希腊字母大小写分式括号求和积分连乘根式三角函数运算符集合运算箭头逻辑运算符约等于向量绝对值申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计1077字&…...
解决jupyter以及windows系统中pycharm编译器画图的中文乱码问题大全
一、jupyter环境下中文乱码问题解决 我们在jupyter的notebook中使用matplotlib画图的时候,经常性的会遇见一些中文乱码显示□的情况,如下所示: 在此,网上给出的方法大多是以下的解决方法: import matplotlib.pyplot as pltplt.rcParams[fo…...
06 OpenCV 阈值处理、自适应处理与ostu方法
1 基本概念 CV2中使用阈值的作用是将灰度图像二值化,即将灰度图像的像素值根据一个设定的阈值分成黑白两部分。阈值处理可以用于图像分割、去除噪声、增强图像对比度等多个领域。例如,在物体检测和跟踪中,可以通过对图像进行阈值处理来提取目…...
RFC7519规范-JWT - json web token
简介 什么是JWT(JSON Web Token) 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程: 客户端使用用户名和密码请求登录服务端收到请求,验证用户名和密码验证成功后,服务端会签发一个token,再把这个to…...
移动机器人设计与实践课程大纲
MiR移动机器人参考资料:图一 西北工业大学-课程平台图二 清华大学出版社-移动机器人目前,基本都是双一流大学开设此类课程,并且都是至少3-4学分,16学时/学分,48-64学时。(⊙﹏⊙),难办了。咱这只有…...
Lesson 7.2 Mini Batch K-Means与DBSCAN密度聚类
文章目录一、Mini Batch K-Means 算法原理与实现二、DBSCAN 密度聚类基本原理与实践1. K-Means 聚类算法的算法特性2. DBSCAN 密度聚类基本原理3. DBSCAN 密度聚类的 sklearn 实现除了 K-Means 快速聚类意外,还有两种常用的聚类算法。(1) 是能…...
11.Dockerfile最佳实践
Dockerfile 最佳实践 Docker官方关于Dockerfile最佳实践原文链接地址:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ Docker 可以通过从 Dockerfile 包含所有命令的文本文件中读取指令自动构建镜像,以便构建给定镜像。 …...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
