深入浅出mysql分库分表

文章目录

    • 为什么要分库分表?
    • 什么场景下才需要分库分表?
      • 1. 数据量增长导致数据量过大--分表
      • 2. 高并发访问--分库
      • 3. 地理分散的业务--分库
    • 分库分表的区别
      • 分库(Database Sharding)
      • 分表(Table Partitioning)
    • 垂直拆分、水平拆分的区别
      • 垂直拆分(Vertical Partitioning)
      • 水平拆分(Horizontal Partitioning)
    • 浅谈

分库分表也是一个老生常谈的问题,很多人都习惯把分库分表放在嘴边,来显得高大上,其实我对于这点是非常不赞同的。先说明关键点:“ 非必要绝对不要进行分库分表

为什么要分库分表?

很多人总是第一反应说因为高并发,其实这个回答是非常不严谨的。我见过非常多的高并发系统都是单库单服务,照样跑的很稳定。其实分库分表的核心是**《数据库面临了性能瓶颈》**
所以分库分表是只有在数据库的性能处理能力确实满足不了当前情况,且已经很难靠业务进一步提升后,才采取的必要措施,如果性能满足的情况下,非必要绝对不要进行分库分表
因为分库分表一定会带来额外的复杂性和挑战,带来的成本也是巨大的

  1. 增加复杂性:开发者需要处理数据的分片逻辑、路由请求到正确的数据库实例等,这增加了开发和维护的难度
  2. 数据一致性问题:在分布式数据库环境中,保持数据的一致性是一个挑战。跨多个数据库实例的事务处理更加复杂,可能导致数据不一致的风险
  3. 事务管理困难:传统的数据库事务(ACID属性)在分库分表后变得难以实现。跨多个数据库的事务需要额外的协调机制,这可能影响性能
  4. 查询性能下降:虽然分库分表可以提高单个数据库的性能,但跨多个数据库的查询可能需要更多的协调和数据聚合,这可能导致整体查询性能下降
  5. 数据迁移和同步问题:数据迁移到新的分库分表架构可能非常复杂和耗时。此外,保持数据在多个数据库之间的同步也是一个持续的挑战
  6. 增加运维成本:管理多个数据库实例需要更多的运维工作,包括监控、备份、故障恢复等,这会增加运维成本
    虽然当前分库分表的技术已经相当成熟了,但是对于这个最终的选择仍然需要慎重

什么场景下才需要分库分表?

1. 数据量增长导致数据量过大–分表

这个应该很好理解,就是单表的存储的数据量超过一定的阈值,比如可能单表数据1000W条,或者可能占用了3-4G的磁盘,这个时候sql查询的性能会明显的下降,并且这个时候通过优化索引也没有办法很好的解决的情况下,这个时候就可以考虑用分表的方式将数据分散到多个表里面
这里通常采取的是横向拆分

这里的核心其实就是因为数据量的增多,导致B+树层数的增加,导致IO增加,引起性能下降。其实单表最多能记录多少条数据而不卡这个跟单条数据的大小也是有很大的关系的,具体业务具体分析,记住技术是为业务服务的,业务也倡导技术的发展

但是这里在最终确定选择这个方案前,可能还有其他考量,比如确定大量数据的原因,历史数据是否一定需要保存(比如起一个定时任务每天定时清理三个月前的数据)?是否可以直接删除或者存档es等来缓解单表数据量的压力,如果可以当然也没必要分表

2. 高并发访问–分库

单库的访问量过高,导致数据库压力过大,也是一个核心问题。这个可能也跟数据库机器的性能相关,对于机器好的服务来说,可能抗压能力更强,但是如果再高点比如7-8k qps,数据库的稳定性也面临着相当大的压力。这个时候就不是分表的问题了,这里应该是采用分库的方式,通过增加数据库的方式将访问的压力分散到多个数据库实例中,来提高整体的并发处理能力
一般的分库都是搭配微服务架构,常见的做法是根据业务的归属拆分不同的库,将不同的表拆分到不同的库中以达到专库专用,在降低风险的同时也减低了耦合度

3. 地理分散的业务–分库

这个比较少见,业务覆盖多个地区或国家,需要在不同地理位置提供服务,然后在地区本地部署服务以减少时延,或者某些地区的数据保护法规要求数据必须存储在本地等等,这里就不做扩充

分库分表的区别

分库(Database Sharding)

定义: 分库是指将数据分布到多个数据库实例中,每个实例可以是独立的数据库服务器或者集群。通常用于处理跨多个业务模块的大规模数据,适用于业务模块之间相对独立的场景
特点:

  • 每个数据库实例存储的数据是独立的,互不干扰
  • 可以针对不同的业务模块或数据类型进行分库
  • 通常用于解决单一数据库实例无法承载的数据量或并发请求量问题。

适用场景:

  • 业务模块之间关联性不大,可以独立存储和管理
  • 数据量或访问量非常大,单一数据库无法满足性能需求
  • 需要根据业务模块进行物理隔离,例如出于安全或合规性考虑

分表(Table Partitioning)

定义: 分表是指将单个表中的数据分割成多个子表,这些子表可以分布在同一个数据库实例中,也可以分布在不同的实例中。
特点:

  • 子表之间在逻辑上是连续的,但在物理上是独立的
  • 通常基于某种键值(如时间戳、ID范围)进行数据分割
  • 可以提高查询和更新的性能,尤其是在处理大量数据的表时

适用场景:

  • 表中的数据量非常大,单一表的维护和查询效率低下
  • 需要对数据进行逻辑上的分组,例如按照时间范围存储日志数据
  • 希望简化数据管理,例如通过分表来实现数据的自动归档和清理

垂直拆分、水平拆分的区别

垂直拆分(Vertical Partitioning)

定义: 垂直拆分是指根据数据表的列来拆分数据,将一个表中不常用的列或业务逻辑上相对独立的列拆分到不同的表或数据库中。垂直拆分是按列进行的,关注的是表的宽度。这个一般很少在系统后续优化中使用,除非是大规模的重构,一般会在数据库设计的初期就考虑好相关的问题。举例假设拆分一张用户表,将用户工号,用户名等关键字段放在主表,将性别,学历等其它字段放到子表,这样其实业务中用到这些字段的地方都需要修改,成本也是很高的
特点:

  • 减少了表的宽度,每个表只包含一部分列
  • 可以提高查询性能,因为查询时只需要访问相关的列
  • 有助于业务逻辑的分离,使数据库更加模块化

适用场景:

  • 当表中包含大量列,但查询通常只访问其中一小部分列时
  • 需要根据业务逻辑对数据进行分离,例如将用户信息和交易记录分开存储

水平拆分(Horizontal Partitioning)

定义: 水平拆分是指根据数据表的行来拆分数据,将数据按照某种规则(如范围、哈希等)分割到不同的表或数据库中。水平拆分是按行进行的,关注的是表的长度。水平拆分可以减少单表的数据量,提高查询和更新的性能,有助于根据数据的属性进行逻辑分组
特点:

  • 减少了单表的数据量,有助于提高单表的查询和更新性能
  • 需要考虑数据分片键的选择,以确保数据均衡分布
  • 可能需要跨多个表或数据库进行查询,增加了查询的复杂性

适用场景:

  • 当表中的数据量非常大,单一表难以有效管理时
  • 需要根据数据的某个属性(如时间、地区、用户ID)进行逻辑分组

浅谈

现在发展的很快,其实大部分的情况下,服务器的资源都是过剩的,就导致大部分的公司项目团队和开发根本不关心sql的性能问题,本着快速做完能跑就行去开发代码,或者直接干脆以空间换时间,采用高性能的机器扩容等即可。我见过太多的开发的sql非常浪费,优化空间巨大

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

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

相关文章

Qt学习:Qt用户界面的核心元素

Qt界面设计主要包括以下几个核心元素: 窗口和对话框:Qt中的基本组件之一是窗口(Window),它可以包含各种控件,如按钮、文本框、列表框等,用于展示信息和接收用户输入。对话框(Dialog&…

C++_STL---priority_queue

priority_queue的相关介绍 优先级队列是一种容器适配器,根据严格的排序标准,它的第一个元素总是它所包含的元素中最大(小)的。该容器适配器类似于堆,在堆中可以随时插入元素,并且可以检索最大(小)堆元素(优先级队列中位于顶部的元…

等保2.0中还有哪些针对云计算的安全要求?

等保2.0中针对云计算的安全要求概述 等保2.0是中国信息安全等级保护制度的升级版,它对云计算环境提出了一系列特定的安全要求,以确保云服务的安全性和合规性。以下是一些关键的云计算安全扩展要求: 基础设施位置:要求云计算基础…

内涵:日常工作中docker的常用知识

内涵:日常工作中docker的常用知识 1. docker高频指令(与参数)2. 单docker使用场景3.双(多)docker使用场景 正如 优雅:从系统环境到依赖包的管理,最近工作中,对开发、部署环境中的管…

电子画册制作的小秘密都在这篇文章了

电子画册作为现代营销和展示的重要工具,已经成为各类企业和个人宣传品的首选。相比传统印刷画册,电子画册不仅节省成本,还能通过多媒体元素增强视觉冲击力,提升用户互动体验。本文将介绍电子画册制作的基础步骤和关键要点&#xf…

电气-伺服(4)CANopen

一、CAN Controller Area Network ,控制器局域网,80年的德国Bosch的一家公司研发可以测量仪器直接的实时数据交换而开发的一款串行通信协议。 CAN发展历史 二、CAN 的osi 模型 CAN特性: CAN 的数据帧 三、CANopen 什么是CANopen CANopen 的网络模型 …

Unity In App Purchasing内购校验

1,利用收据验证混淆器 把后台的key填进去,点击自动生成一些文件 2,代码过滤 using UnityEngine.Purchasing.Security;在IAPManager.cs的 public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e)增加 #if !UNITY_EDITOR…

【C++之unordered_set和unordered_map的模拟实现】

C学习笔记---025 C之unordered_set和unordered_map的模拟实现1、unordered_set的模拟实现2、unordered_map的模拟实现 C之unordered_set和unordered_map的模拟实现 前言: 前面篇章学习了C对unordered_set和unordered_map的认识和应用,接下来继续学习&am…

Java_网络通信:TCP和UDP

1、区别 TCP Transfer Control Protocol 是一种面向连接的、可靠的、传输层通信协议。 ​ 特点: 好比是打电话:面向连接的,点对点的通信,高可靠的,效率比较低,占用的系统资源比较多。 UDP User Datagram…

香橙派AIpro如何赋能AI+边缘流媒体设备

文章目录 (一)前言(二)AI边缘流媒体设备展示(三)赋能AI边缘流媒体设备1、准备开发环境2、在板子中下载编译安装SRS3、基本推拉流测试4、多路推流性能测试 (四)一些注意事项1、开发板…

ESP32-C3模组上跑通MD5(3)

接前一篇文章:ESP32-C3模组上跑通MD5(2) 本文内容参考: ESP32 MD5 代码_esp32 idf md5开启-CSDN博客 ESP32学习笔记(47)——加密算法AES/MD5/SHA_esp32 aes-CSDN博客 特此致谢! 上一回解析了ESP-IDF中组件(components)中MD5相关的例程,也给出了笔者参照该例程自行…

springboot 篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

【笔记】字符串相似度代码分享

目录 一、算法介绍1、算法1)基于编辑距离2)基于标记3)基于序列4)基于压缩5)基于发音6)简单算法 2、安装 二、代码demo1、Hamming 距离2、Levenshtein 距离3、Damerau-Levenshtein距离4、Jaro 相似度5、Jaro…

ctfshow sql注入

开启其他注入 web221 limit注入 给出查询语句 以及过滤逻辑为空 获取数据库名即可 limit 用于控制返回结果行数 limit后面似乎只能跟PROCEDURE ANALYSE( ) 函数了 PROCEDURE ANALYSE( ) 函数用于分析查询结果的函数 参数是用来控制函数的 这个参数的位置 可以放入报错函数 原…

MySQL—创建查看删除备份恢复数据库

创建数据库 创建数据库 LLF_DB01CREATE DATABASE LLF_DB01删除数据库DROP DATABASE LLF_DB01创建一个使用utf8字符集的数据库并带校对规则的数据库CREATE DATABASE hsp_db03 CHARACTER SET utf8 COLLATE utf8_bin 查看、删除数据库 显示所有的数据库SHOW DATABASES显示数据库…

AI PC(智能电脑)技术分析

一文看懂AI PC(智能电脑) 2024年,英特尔、英伟达等芯片巨头革新CPU技术,融入AI算力,为传统PC带来质的飞跃,引领智能计算新时代。 2024年,因此被叫作人工智能电脑(AI PC)…

归一化(normalization)

归一化是指对数据进行标准化处理,使其均值为0,方差为1,从而消除不同特征量纲的影响,使得不同特征之间可以进行比较和计算。对于时间序列数据,归一化的目的是减弱非平稳性,使得模型能够更好地学习数据的规律…

2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛B题超详细解题思路+数据预处理问题一代码分享

B题 洪水灾害的数据分析与预测 亚太中文赛事本次报名队伍约3000队,竞赛规模体量大致相当于2024年认证杯,1/3个妈杯,1/10个国赛。赛题难度大致相当于0.6个国赛,0.8个妈杯。该比例仅供大家参考。 本次竞赛赛题难度A:B:C3:1:4&…

C语言程序是怎么在计算机中运行起来的

hello.c #include <stdio.h>int main(){printf("hello,world\n");return 0; }这段 C语言程序的代码能被编程人员读懂&#xff0c;但是计算机系统读不懂。C语言、C、java 这些高级编程语言本质上还是人类用的语言而不是计算机用的语言。 为了能在计算机上运行这…

无忧易售功能:刊登页面文本翻译,无缝对接全球买家

每一个词语&#xff0c;每一句话&#xff0c;都承载着产品的灵魂和品牌的故事&#xff0c;无忧易售的刊登页面文本翻译服务&#xff0c;一键操作即可将你的产品介绍、详情或广告文案转化为多语言版本&#xff0c;轻松管理&#xff0c;高效发布。 一、Allegro、OZON、Coupang、…