实际应用中MySQL分库分表实践总结原理

MySQL分库分表策略详解:从理论到实践的最佳方案 分库分表是应对海量数据的高阶解决方案,需要根据业务特点选择合适策略。理想的架构应该:满足未来3-5年的业务增长保持合理的复杂度预留扩展空间具备完善的监控体系记住:没有完美的分片方案,只有最适合业务现状的权衡选择。希望本文能为您的分库分表实践提供全面指导。 阅读详情

实际应用中MySQL分库分表实践总结原理

互联网系统需要处理大量用户的请求。比如微信日活用户破10亿,海量的用户每天产生海量的数量;美团外卖,每天都是几千万的订单,那这些系统的用户表、订单表、交易流水表等是如何处理呢?

数据量只增不减,历史数据又必须要留存,非常容易成为性能的瓶颈,而要解决这样的数据库瓶颈问题,“读写分离”和缓存往往都不合适,目前比较普遍的方案就是使用NoSQL/NewSQL或者采用分库分表。

使用分库分表时,主要有垂直拆分和水平拆分两种拆分模式,都属于物理空间的拆分。

分库分表方案:只分库、只分表、分库又分表。

垂直拆分:由于表数量多导致的单个库大。将表拆分到多个库中。

水平拆分:由于表记录多导致的单个库大。将表记录拆分到多个表中。

一、传统项目结构

1.1数据库面临的性能瓶颈

① 数据库连接 数据库连接是非常稀少的资源,MySQL数据库默认100个连接,单机最大1500连接。如果一个库里既有用户相关的数据又有商品、订单相关的数据,当海量用户同时操作时,数据库连接就很可能成为瓶颈。

② 数据量 MySQL单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而变弱。MySQL单表的数据量是500w-1000w之间性能比较好,超过1000w性能也会下降。

③ 硬件问题 因为单个服务的磁盘空间是有限制的,如果并发压力下所有的请求都访问同一个节点,肯定会对磁盘IO造成非常大的影响。

1.2数据库优化方案

① 参数优化 ② 缓存、索引 ③ 读写分离 ④ 分库分表 (最终方案)

二、数据库拆分方式

1、垂直拆分

垂直拆分又称为纵向拆分,垂直拆分是将表按库进行分离,或者修改表结构按照访问的差异将某些列拆分出去。应用时有垂直分库和垂直分表两种方式,一般谈到的垂直拆分主要指的是垂直分库。

如下图所示,采用垂直分库,将用户表和订单表拆分到不同的数据库中。

垂直分表就是将一张表中不常用的字段拆分到另一张表中,从而保证第一张表中的字段较少,避免出现数据库跨页存储的问题,从而提升查询效率。
解决:一个表中字段过多,还有有些字段经常使用,有些字段不经常使用,或者还有text等字段信息。可以考虑使用垂直分表方案。

按列进行垂直拆分,即把一条记录分开多个地方保存,每个子表的行数相同。把主键和一些列放到一个表,然后把主键和另外的列放到另一个表中。

垂直拆分优点:

拆分后业务清晰,拆分规则明确;

易于数据的维护和扩展;

可以使得行数据变小,一个数据块 (Block) 就能存放更多的数据,在查询时就会减少 I/O 次数;

可以达到最大化利用 Cache 的目的,具体在垂直拆分的时候可以将不常变的字段放一起,将经常改变的放一起;

便于实现冷热分离的数据表设计模式。

垂直拆分缺点:

主键出现冗余,需要管理冗余列;

会引起表连接 JOIN 操作,可以通过在业务服务器上进行 join 来减少数 据库压力,提高了系统的复杂度;

依然存在单表数据量过大的问题;

事务处理复杂。

2、水平拆分

水平拆分又称为横向拆分。 相对于垂直拆分,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个表仅包含数据的一部分,如下图所示。

水平分表是将一张含有很多记录数的表水平切分,不同的记录可以分开保存,拆分成几张结构相同的表。如果一张表中的记录数过多,那么会对数据库的读写性能产生较大的影响,虽然此时仍然能够正确地读写,但读写的速度已经到了业务无法忍受的地步,此时就需要使用水平分表来解决这个问题。

水平拆分:解决表中记录过多问题。

垂直拆分:解决表过多或者是表字段过多问题。

水平拆分重点考虑拆分规则:例如范围、时间或Hash算法等。

水平拆分优点:

拆分规则设计好,join 操作基本可以数据库做;

不存在单库大数据,高并发的性能瓶颈;

切分的表的结构相同,应用层改造较少,只需要增加路由规则即可;

提高了系统的稳定性和负载能力。

水平拆分缺点:

拆分规则难以抽象;

跨库Join性能较差;

分片事务的一致性难以解决;

数据扩容的难度和维护量极大。

日常工作中,我们通常会同时使用两种拆分方式,垂直拆分更偏向于产品/业务/功能拆分的过程,在技术上我们更关注水平拆分的方案。

三、分库分表需要解决的问题

3.1分布式事务问题

解决方案: ① 采用补偿事务,例如TCC来解决分布式事务问题。 ② 用记录日志等方式来解决分布式事务问题。

3.2分布式主键ID冲突问题

解决方案: ① 利用Redis的incr命令生成主键。 ② 用UUID生成主键(不建议:字段比较长、不好排序)。 ③ 利用snowake算法生成主键。

3.3跨库join问题

解决方案: ① 将有E-R关系的表存储到一个库中。 ② 对于数据量少的表建成全局表,分布到各个库中 ③ 对于必须跨库join的,最多支持跨两张表的跨库join

四、SNOWFLAKE策略

有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成,SnowFlake解决了这种需求。SnowFlake是Twitter开源的分布式ID生成算法,结果是一个long型的ID,long型是8个字节,64-bit。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号,最后还有一个符号位,永远是0。如下图所示:

SnowFlake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID重复,并且效率较高。经测试SnowFlake每秒能够产生26万个ID。缺点是强依赖机器时钟,如果多台机器环境时钟没同步,或时钟回拨,会导致发号重复或者服务会处于不可用状态。因此一些互联网公司也基于上述的方案做了封装,例如百度的uidgenerator(基于SnowFlake)和美团的leaf(基于数据库和SnowFlake)等。

五、扩容方面

当系统用户进入了高速增长期时,即便是对数据进行分库分表,但数据库的容量,还有表的数据量也总会达到天花板。当现有数据库达到承受极限时,就需要增加新服务器节点数量进行横向扩容。

首先来思考一下,横向扩展会有什么技术难度?

数据迁移问题

分片规则改变

数据同步、时间点、数据一致性

遇到上述问题时,我们可以使用以下两种方案:

1、停机扩容

这是一种很多人初期都会使用的方案,尤其是初期只有几台数据库的时候。停机扩容的具体步骤如下:

站点发布一个公告,例如:“为了为广大用户提供更好的服务,本站点将在今晚00:00-2:00之间升级,给您带来不便抱歉";

时间到了,停止所有对外服务;

新增n个数据库,然后写一个数据迁移程序,将原有x个库的数据导入到最新的y个库中。比如分片规则由%x变为%y;

数据迁移完成,修改数据库服务配置,原来x个库的配置升级为y个库的配置

重启服务,连接新库重新对外提供服务

回滚方案:万一数据迁移失败,需要将配置和数据回滚,改天再挂公告。

优点:简单

缺点:

停止服务,缺乏高可用

程序员压力山大,需要在指定时间完成

如果有问题没有及时测试出来启动了服务,运行后发现问题,数据会丢失一部分,难以回滚。

适用场景:

小型网站

大部分游戏

对高可用要求不高的服务

2、平滑扩容

数据库扩容的过程中,如果想要持续对外提供服务,保证服务的可用性,平滑扩容方案是最好的选择。平滑扩容就是将数据库数量扩容成原来的2倍,比如:由2个数据库扩容到4个数据库,具体步骤如下:

新增2个数据库

配置双主进行数据同步(先测试、后上线)

数据同步完成之后,配置双主双写(同步因为有延迟,如果时时刻刻都有写和更新操作,会存在不准确问题)

数据同步完成后,删除双主同步,修改数据库配置,并重启;

此时已经扩容完成,但此时的数据并没有减少,新增的数据库跟旧的数据库一样多的数据,此时还需要写一个程序,清空数据库中多余的数据,如:

User1去除 uid % 4 = 2的数据;

User3去除 uid % 4 = 0的数据;

User2去除 uid % 4 = 3的数据;

User4去除 uid % 4 = 1的数据;

平滑扩容方案能够实现n库扩2n库的平滑扩容,增加数据库服务能力,降低单库一半的数据量。其核心原理是:成倍扩容,避免数据迁移。

优点:

扩容期间,服务正常进行,保证高可用

相对停机扩容,时间长,项目组压力没那么大,出错率低

扩容期间遇到问题,随时解决,不怕影响线上服务

可以将每个数据库数据量减少一半

适用场景:

  • 大型网站
  • 对高可用要求高的服务

以上就是本文对MySQL分库分表实践总结,前面博主也有分享,链接:分布式数据库MyCat综合实战

【MySQL深入】分库分表原理 1.背景 随着公司业务的高速发展,数据量越来越大,已经到达了千万级别,预计不久后就会破亿。原来的MySQL架构(一主多从)已不适应这么大的数据量,所以急需技术升级。 数据量预计:现在单表的数据量在1400万行左右,按照现在的业务,每天5.6万的增量,一年增加2050万左右,加上业务的增长,预计在3年后达到亿级。 当数据量达到千万甚至上亿时,单台数据库服务器的存储能力会成为系统的瓶颈,主要体现在以下几个方面 数据量太大,读写的性能会下降,即使有索引,索引也会变得很大,性能同样会降下。 数据库文件会得很大 阅读详情

相关推荐

通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch

以及在 application.yml 中配置出需要链接的库表以及同步的目标地址,也就是 es 的地址。本节涉及到了简明教程中所讲解的 Sharding 分库分表 (opens new window)的使用,因为我们需要把分库分表的数据通过 canal 同步到 Elasticsearch。docs/dev-ops/tech-canal-docker-compose.yml:提供了所需的环境安装,mysql、canal-server、canal-adapter、elasticsearch、kibana。

优快云_LiMingfly的博客 1596

MySQL分库分表

本文知识点较多,篇幅较长,请耐心学习 题记: 文章内容输出来源:拉勾教育Java高薪训练营。 本篇文章是 MySQL 学习课程中的一部分笔记。 MySQL分库分表 互联网系统需要处理大量用户的请求。比如微信日活用户破10亿,海量的用户每天产生海量的数量;美团外卖,每天都是几千万的订单,那这些系统的用户表、订单表、交易流水表等是如何处理呢? 数据量只增不减,历史数据又必须要留存,非常容易成为性能的瓶颈,而要解决这样的数据库瓶颈问题,“读写分离”和缓存往往都不合适,目前比较普遍的方案就是使用NoSQL/Ne.

weixin_41018580的博客 9924

C++常见面试题总结

C++常见面试题总结

xu_fu_yong的专栏 8万+

不同MySQL服务的表以及库的数据迁移(/备份)

不同MySQL服务的表以及库的数据迁移(/备份)

ws_please的博客 971

Shader Graph实战:5分钟搞定Flow Map水体流动效果(含UV偏移避坑指南)

本文详细解析了如何使用Unity的Shader Graph工具快速实现Flow Map水体流动效果,涵盖基础原理、核心节点搭建、高级技巧及性能优化。特别针对UV偏移问题提供避坑指南,帮助开发者轻松打造专业级动态水面效果,适合游戏场景增强视觉表现。

weixin_29250403的博客 246

【ESP32】1.编译、烧录、创建工程

本文介绍了在VSCode中搭建ESP32开发环境并烧录"Hello World"工程的过程。首先通过串口工具成功下载固件后,解决了OpenOCD报错问题。针对头文件无法识别的问题,修改了c_cpp_properties.json配置文件,调整了编译器路径和IntelliSense模式。文章还详细说明了创建新工程的步骤,包括选择芯片型号和项目模板,并验证了串口打印功能。最后提醒在项目构建时要等待完成,避免文件缺失。整个流程涵盖了环境搭建、代码烧录、调试及新项目创建等关键环节。

梁山1号 1485

一文读懂MySQL分库分表的实现原理和策略

在大型的数据应用场景下,MySQL作为一个关系型数据库管理系统(RDBMS)是非常受欢迎的。然而,MySQL在处理大量数据时会遇到瓶颈,为了解决这个问题,分库分表是一种有效的解决方案。分库分表的基本概念是将一个大型数据库分成多个较小的数据库(分库),并将每个数据库的数据进一步分成多个较小的表(分表),每个表只包含部分数据。这种方式使得查询和更新操作可以在多个数据库和表之间并行执行,提高了系统的扩展性和性能。本文将介绍MySQL分库分表的实现原理、常见的分库分表策略、以及如何在MySQL中实现分库分表。

Dark_orange的博客 3727

FMEA-MSR步骤三:功能分析

目的 FMEA-MSR功能分析的主要目标: ● 功能及各功能之间的关系的可视化 ● 功能树/网络或等效功能矩阵参数图(P图) ● 顾客(外部和内部)功能与相关要求的关联 ● 要求或特性与功能的关联 ● 工程团队(系统、安全和组件)之间的协作 ● 失效分析步骤的基础 (点击链接进入官网领取软件试用) 在监视及系统响应的补充FMEA中,对失效探测和失效响应的监视视为其具有的功能。硬件和软件功能可能包括监视控制状态的功能。 故障/失效的监视和探测功能可能包括超出范围的探测、循环冗余校验、真实性检查和序列计数器检查

Infomass的博客 2393

Mysql的分库分表策略+ 唯一id怎么生成

分库分表

weixin_70280523的博客 1287

OpenFOAM算例文件结构深度解析:以cavity案例为例教你读懂每个文件夹的作用

本文以OpenFOAM经典cavity案例为例,深度解析CFD算例文件结构。详细阐述了0、constant、system三个核心目录的作用:0存放初始与边界条件,constant定义物理属性和网格,system控制求解策略。通过剖析关键文件,帮助用户理解每个参数的意义,掌握从读懂到定制算例的能力,为高效使用这一开源CFD工具奠定坚实基础。

beer8的博客 241

Spring Boot:如何快速搭建一个高性能微服务架构?

通过本文的详细步骤,我们成功搭建了一个高性能的微服务架构。Spring Boot 和 Spring Cloud 提供了强大的工具链,使得开发者能够快速实现服务注册与发现、负载均衡、熔断器与降级机制等功能。同时,通过数据库连接池、Redis 缓存和异步处理等优化手段,进一步提升了系统的性能和可靠性。希望本文能够帮助你快速入门 Spring Boot 微服务架构的搭建,并为实际项目提供参考。如果你有任何问题或建议,欢迎在评论区留言!

shrgegrb的博客 1013

MySQL 分库分表实践

一、为什么要分库分表 二、库表太大产生的问题 三、垂直拆分 1. 垂直分库 2. 垂直分表 四、水平分库分表 2. 测试水平分表

长期更新自学笔记 5666

计算机组成原理(第三版)唐朔飞-第三章系统总线-课后习题

计算机组成原理(第三版)唐朔飞-第三章系统总线-课后习题

weixin_45735391的博客 6万+

MySQL分库分表原理

MySQL分库分表原理前言数据库为什么要分库分表影响数据库性能的三个要素数据量磁盘数据库连接1、分库分表的原理和实现1.1 什么是分区、分表、分库分区分表分库1.2 什么时候考虑使用分区?分区解决的问题分区的实现方式(简单),例如:1.3 分库分表概述1.4 适用场景1.5 业务分库(又叫mysql垂直拆分)1.6 业务分表(又叫水平拆分)1.6.1 业务分表带来的问题:1.6.2 路由问题1.6...

weixin_35720385的博客 1983

【ComfyUI】Wan 2.2 14B 首尾帧转视频 平滑过渡

本文介绍了基于 Wan2.2 ComfyUI 的视频生成工作流,通过预训练模型、提示词与参考图像的结合,实现高质量视频合成。工作流采用高低噪声模型与 LoRA 模块优化风格与细节,确保画面过渡平滑稳定。核心流程包括模型加载、图像输入、提示词编码、潜空间采样、解码与视频合成,最终生成动态转场视频。节点设计涵盖 CLIPTextEncode、KSamplerAdvanced 等关键模块,协同完成从文本到视频的全链路生成。正向提示词作为核心驱动力,直接影响视频的动作、镜头与画面变化。

Mr数据杨 1705

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL 分库分表:原理、应用与实践

MySQL 分库分表是一种应对大数据量和高并发的有效策略,它可以显著提高数据库系统的性能、可扩展性和数据管理能力。在实际应用中,需要根据业务需求和数据特点合理选择分库分表的方式,并结合适当的数据库中间件或工具来实现。无论是前端还是后端开发人员,都需要了解分库分表的原理和应用场景,以便在开发过程中更好地设计和实现系统功能,确保系统能够高效、稳定地运行。同时,随着业务的发展和数据量的变化,可能需要不断调整和优化分库分表策略,以满足系统不断增长的需求。

m0_57836225的博客 1374

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

3天,我把MySQL索引、锁、事务、分库分表撸干净了!

前两天看到字节一个老哥写的帖子,提到高阶开发者必须掌握的技能,其中他明确提出了“精通MySQL”。 为啥MySQL对开发人员如此重要? 第一,不管你去面试哪家公司,数据库是必问项,而MySQL使用范围广,无论如何是避不开的; 第二,你对MySQL掌握的越深入,意味着你能做的事情越多。 实现业务功能,要懂基本的SQL语句; 性能优化,那么索引、引擎就要摸透; 想分库分表,主从同步机制、读写分离你就得了解; 安全方面,你得知道权限、备份、日志等等; 涉及到云数据库,就得懂源码及瓶颈。

woshisunmoumou的博客 4499

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MySQL分库分表:原理、实现与优化

分库分表是将原本存储在一个数据库中的数据,按照一定的规则分散到多个数据库和数据表中,以实现数据的分布式存储和访问。提高读写性能:通过分散数据和负载,减轻单库单表的压力,提升系统整体性能。提高存储容量:每个数据库和表存储的数据减少,解决单库单表存储容量受限的问题。提高系统可扩展性:通过增加数据库实例和数据表,可以灵活扩展系统的存储和处理能力。MySQL分库分表是应对大规模数据和高并发访问的有效手段。通过将数据按一定规则分散到多个库和表中,可以显著提升系统的性能和扩展性。

良月柒 1206

MySQL分库分表的实践与挑战

本文探讨了MySQL分库分表的核心技术与解决方案。当单表数据量超过1000万行或并发压力过大时,需要考虑分库分表。主要技术包括水平分表(按范围或哈希分片)、垂直分表(按字段热度拆分)和分库(按业务模块拆分)。分库分表会带来分布式事务、跨库查询和数据迁移等新问题,可通过中间件(如Sharding-JDBC)和分布式事务方案解决。文章通过电商订单等实际案例,详细说明了各种分片策略的实现方法及应对方案,为处理大数据量场景提供了实用指导。

没事学AI的博客 1332

MySQL 分库分表实践:Spring Boot + ShardingSphere

至此,我们就完成 Spring Boot + ShardingSphere 的 MySQL 分库分表实践。商品订单的分库分表是一个很典型的案例,也是工作中遇到的常见场景。当然,实际业务也可能遇到不同的分库分表策略,比如按照日期分库分表的,不过这些都可以编写分片算法来解决。实际上,如果对 MySQL 分库分表理论基础,和 ShardingSphere 的原理及核心概念有一定的学习了解,业务开发中遇到的分库分表都相信可以很轻松地应对。

sc35262的博客 1651

ShardingJDBC5实现MySQL分库分表的实践指南

摘要:本文详细介绍了ShardingJDBC5在MySQL分库分表中的核心应用。针对单表数据量过大问题,通过分片规则配置、SQL解析路由等机制,实现透明化数据分片。文章包含完整的SpringBoot集成示例,从Maven依赖引入到实际数据节点配置,演示了按user_id取模分表的实现过程,并展示了分库分表场景下的进阶配置方案。实践表明,ShardingJDBC能有效提升系统扩展性,简化分布式数据库操作。

没事学AI的博客 1112

深入解析MySQL数据库分库分表技术

分库分表是一种将数据从单一数据库中拆分到多个数据库或表中的技术,旨在提高数据的存储和查询效率。随着数据量的不断增长,单一数据库在处理高并发请求时可能会遇到性能瓶颈,导致响应时间延长和系统崩溃。因此,分库分表成为了现代数据库设计中不可或缺的一部分。分库分表是解决大规模数据存储和查询问题的重要手段,但在实际应用中也面临着很多挑战。理解分库分表的原理和策略,选择合适的分库分表方案,对于构建高可用、高性能的分布式系统至关重要。希望本文能够帮助读者更好地理解MySQL数据库的分库分表技术,并在实际开发中能够熟练运用。

码上飞扬的博客 1619

MySQL篇——详细分库分表原理,深入解读分库分表时机、策略以及生产解决方案!

MySQL分库分表是为了解决大规模数据的存储和查询问题。当一个应用的数据量逐渐增大,单个数据库可能无法满足存储和查询的需求,这时就需要进行分库分表。分库指的是将数据按照一定的规则拆分到多个数据库中,每个数据库中存放一部分数据。通过分库可以提升存储的能力,每个数据库可以存储更多的数据量。分表指的是将一张大表按照一定的规则拆分成多个小表,每个小表只存放一部分数据。通过分表可以提升查询的性能,每个小表查询的数据量较少,查询速度更快。

我热爱学习,也乐于分享。无论是科技前沿的洞见,还是生活中的小技巧,我都会在这里与你分享。我相信,知识就是力量,而分享则能让这份力量得到更好的传递。 1890
上一篇: 面试官:ArrayList和LinkedList在性能方面的差别,能有多大?
下一篇: 消息队列——经典5连问——你能抗几道?
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值