当前位置: 首页 > news >正文

详解分库分表设计

详解分库分表设计

背景

​ 在传统的单机数据库架构中,所有数据都存储在同一个数据库中,随着业务规模的不断扩大,数据量和并发量也会越来越大,这会给数据库的性能和可用性带来挑战。此外,当单机数据库的容量达到瓶颈时,无法继续扩展,这也限制了应用程序的可扩展性。

​ 为了解决这些问题,分库分表技术应运而生。通过将数据分散存储在多个数据库或表中,可以减轻单一数据库的负载,提高系统的并发性能。此外,分库分表还可以支持水平扩展,使得系统能够随着业务的增长而不断扩展。

总之,分库分表是一种常用的数据库架构设计方案,可以解决数据库在数据量、并发性、可扩展性等方面面临的瓶颈问题,是大规模应用程序必不可少的技术之一。

为什么分库分表

  1. 数据量增大:当数据量逐渐增大时,单个数据库或表可能无法承载所有数据,导致性能下降,甚至崩溃

    分库分表可以将数据分散到多个数据库或表中,每个数据库或表都只负责一部分数据,从而提高系统的性能和可靠性。

  2. 提高并发能力:当多个用户同时访问同一个表时,容易造成数据库的性能瓶颈,导致响应变慢。

    分库分表可以将数据分散到多个数据库或表中,从而提高并发访问能力,减少系统的瓶颈。

  3. 数据隔离:在多租户场景下,不同的租户需要使用不同的数据库或表,以保证彼此的数据隔离。分库分表可以将不同租户的数据分散到不同的数据库或表中,从而保证数据的隔离性。

  4. 降低单节点的压力:当系统需要支持大量数据的读写操作时,单个数据库或表可能无法承载,此时可以将数据分散到多个数据库或表中,从而降低单个节点的压力。

什么是分库分表

  1. 分库:将一个数据库拆分为多个数据库

    1. 水平分库:指将一个大型数据库分成多个较小的、相似的数据库,每个数据库包含数据的不同部分

      例如:将用户数据根据其 ID 值的范围分配到用户库DB1、用户库DB2中。

      这种分片方式可以提高系统的扩展性和性能,因为可以将负载分散到多个数据库中

    在这里插入图片描述

    特点:

    1. 每个库的结构都一样,存储同一业务类型的数据

    2. 每个库的数据都不一样,没有交集

    3. 所有库的并集是全量数据

    4. 垂直分库:是指将一个大型数据库,根据业务关系分成多个较小的数据库。

      例如,将用户数据存储在用户库,订单数据存储在订单库中。

      这种分片方式可以提高系统的灵活性和可维护性,因为可以根据需要对不同的数据库进行单独的优化和维护

    在这里插入图片描述

    特点:

    1. 每个库的结构都不一样,存储不同业务类型的数据

    2. 每个库的数据都不一样,没有交集

    3. 所有库的并集是全量数据

    水平分库和垂直分库并不是互斥的概念,两者可以结合使用来实现更高效的数据库分片方案

  2. 分表:将一个数据表拆分为多个数据表

    1. 水平分表:是指将一个表中的数据按照某个规则分散到多个表中,这个规则通常是基于某个列的取值进行的

      例如,可以根据用户ID,通过范围、Hash、取余等规则将用户表分成多个子表,每个子表中存储特定范围内的用户数据

      水平分表可以提高数据查询效率,因为查询只需要在一个小的子表中执行,而不是在整个表中执行

在这里插入图片描述

  特点:1. 每个表的结构都一样,存储**同一实体、相同类型**的数据2. 每个表存的数据都不一样,没有交集3. 所有表的并集是全量数据
  1. 垂直分表:指将一个表按照列的方式进行分割,将一部分列存储到一个表中,另一部分列存储到另一个表中。这个分割通常是基于列的相关性进行的,典型的如主表和扩展表

    例如,可以将一个包含用户主要信息、用户辅助信息的表分成两个表,一个包含用户主要信息,另一个包含用户辅助信息。

    可以提高数据的存储效率,因为每个表只包含必要的列,而不是整个表的所有列。

在这里插入图片描述

  特点:1. 每个表的结构都不一样,存储**同一实体、不同类型**的数据2. 每个表存的数据都不一样,字段至少有一列交集,一般是主键,用于关联数据3. 所有表的并集是全量数据

拆分策略

  1. 范围切分:按照数据的某个范围将表拆分成多个子表。例如,可以按照时间范围将订单表拆分成每个月的子表。

    优点:

    水平扩展:按照范围进行分库分表可以实现水平扩展,当数据量增加时,可以方便地增加更多的数据库或表;比如以2000万标准拆分,超过2000万的转移到新表,而之前2000万内的记录就无需再做迁移了

    缺点:

    热点问题:如果某些数据访问频率很高,但是按范围切分后,又被分在同一个区段,这样大量请求会集中在这一区段,没有很好的负载均衡效果

  2. 按照哈希值切分:按照数据的哈希值将表拆分成多个子表。例如,可以使用用户ID的哈希值将用户表拆分成多个子表。

    HASH取模策略:指定的路由key(一般是主键ID)对分表总数进行取模,把数据分散到各个表中

    优点:

    ​ 负载均衡,没有明显的热点倾斜问题

    缺点:

    扩展不灵活,如果一开始按照HASH取模分成4个表了,未来某个时候,表数据量又到瓶颈了,需要扩容至,这就比较棘手了,需要重新进行数据迁移

  3. 按照地理位置切分:如果数据与地理位置相关,则可以按照地理位置将表拆分成多个子表。例如,可以按照城市将商家表拆分成多个子表。

  4. 按照业务类型切分:如果数据有不同的业务类型,则可以按照业务类型将表拆分成多个子表。例如,可以按照产品类型将商品表拆分成多个子表。

  5. 按照访问频率切分:如果某些数据被频繁访问,则可以将其放入单独的表中,以便更快地访问。例如,可以将最近一年的订单数据放入单独的表中,以便更快地查询最近的订单。

分库分表工具

  1. ShardingSphere:ShardingSphere是一套开源的分布式数据库中间件解决方案,支持分库分表、读写分离、数据加密等功能。

    官网:https://shardingsphere.apache.org/index_zh.html

  2. Mycat:Mycat是一款基于MySQL协议的开源分布式数据库中间件,支持分库分表、读写分离、数据分片等功能。

    官网:http://www.mycat.org.cn/

  3. TDDL:TDDL是阿里巴巴开源的一款分布式数据库中间件,支持MySQL、Oracle等数据库,提供了分库分表、读写分离、数据分片等功能。

  4. Cobar:Cobar是阿里巴巴开源的一款分布式数据库中间件,支持MySQL、PostgreSQL等数据库,提供了分库分表、读写分离、数据分片等功能。

分库分表问题

  1. 主键(自增 ID)唯一性问题:在表设计时,经常会使用自增 ID 作为主键,这就导致后续在迁库迁表、或者分库分表操作时,会因为主键的变化或者主键不唯一产生问题,解决方案主要有

    1. 采用分布式全局统一 ID 生成机制:如 UUID、雪花算法、数据库号段等方式
  2. 分布式事务:由于数据被分散在多个数据库或表中,事务的处理会变得更加复杂。例如,如果一个事务涉及多个数据库或表,那么如何保证这些操作的原子性就需要更加细致的设计。

  3. Join/分页查询:在分库分表的情况下,查询跨越多个数据库或表就变得更加复杂。例如,如果需要对一组数据进行全文搜索,那么就需要在多个数据库或表中执行查询,这可能会影响查询性能。

    1. 分开查询,再组装数据

    2. 冗余字段:如果每次join操作只是为了获取少量的字段,那么可以考虑直接将这些字段冗余到表上

    3. 数据同步:

      ​ 将数据源之间的数据同步到一个单独的数据仓库中,然后在这个数据仓库中进行join操作。这种方法可以解决跨库跨表的join问题,但是需要额外的存储和同步成本,并且可能存在数据同步延迟和一致性问题

  4. 数据迁移:在分库分表的情况下,如果需要将数据迁移到新的数据库或表中,就需要考虑如何迁移数据,并且在迁移的过程中如何保证数据的一致性。

  5. 系统复杂度:由于分库分表需要管理多个数据库或表,系统的复杂度也会随之增加。例如,需要考虑如何监控每个数据库或表的状态,如何处理数据库或表的故障等等问题。

  6. 数据迁移:在分库分表的情况下,如果需要将数据迁移到新的数据库或表中,就需要考虑如何迁移数据,并且在迁移的过程中如何保证数据的一致性。

  7. 系统复杂度:由于分库分表需要管理多个数据库或表,系统的复杂度也会随之增加。例如,需要考虑如何监控每个数据库或表的状态,如何处理数据库或表的故障等等问题。

相关文章:

详解分库分表设计

详解分库分表设计 背景 ​ 在传统的单机数据库架构中,所有数据都存储在同一个数据库中,随着业务规模的不断扩大,数据量和并发量也会越来越大,这会给数据库的性能和可用性带来挑战。此外,当单机数据库的容量达到瓶颈时…...

动态规划-基础(斐波那契数、爬楼梯、使用最小花费爬楼梯、不同路径、不同路径II、整数拆分、不同的二叉搜索树)

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的。动态规划问题,五步走:状态定义&am…...

深入理解WebSocket协议

“ 一直以来对WebSocket仅停留在使用阶段,也没有深入理解其背后的原理。当看到 x x x was not upgraded to websocket,我是彻底蒙了,等我镇定下来,打开百度输入这行报错信息,随即看到的就是大家说的跨域,或…...

Vector的扩容机制

到需要扩容的时候,Vector会根据需要的大小,创建一个新数组,然后把旧数组的元素复制进新数组。 我们可以看到,扩容后,其实是一个新数组,内部元素的地址已经改变了。所以扩容之后,原先的迭代器会…...

22讲MySQL有哪些“饮鸩止渴”提高性能的方法

短连接风暴 是指数据库有很多链接之后只执行了几个语句就断开的客户端,然后我们知道数据库客户端和数据库每次连接不仅需要tcp的三次握手,而且还有mysql的鉴权操作都要占用很多服务器的资源。话虽如此但是如果连接的不多的话其实这点资源无所谓的。 但是…...

10.0自定义SystemUI下拉状态栏和通知栏视图(六)之监听系统通知

1.前言 在进行rom产品定制化开发中,在10.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能, 所以根据产品需要来自定义SystemUI的下拉状态栏和通知栏功能,首选实现的就是下拉通知栏左滑删除通知的部…...

怎样在外网登录访问CRM管理系统?

一、什么是CRM管理系统? Customer Relationship Management,简称CRM,指客户关系管理,是企业利用信息互联网技术,协调企业、顾客和服务上的交互,提升管理服务。为了企业信息安全以及使用方便,企…...

Activity工作流(三):Service服务

3. Service服务 所有的Service都通过流程引擎获得。 3.1 RepositoryService 仓库服务是存储相关的服务,一般用来部署流程文件,获取流程文件(bpmn和图片),查询流程定义信息等操作,是引擎中的一个重要的服务。…...

算法--最长回文子串--java--python

这个算法题里面总是有 暴力解法 把所有字串都拿出来判断一下 这里有小小的优化: 就是当判断的字串小于等于我们自己求得的最长回文子串的长度,那么我们就不需要在进行对这个的判断这里的begin,还可以用来取得最小回文子串是什么 java // 暴…...

ElasticSearch-第二天

目录 文档批量操作 批量获取文档数据 批量操作文档数据 DSL语言高级查询 DSL概述 无查询条件 叶子条件查询 模糊匹配 match的复杂用法 精确匹配 组合条件查询(多条件查询) 连接查询(多文档合并查询) 查询DSL和过滤DSL 区别 query DSL filter DSL Query方式查…...

【AI大比拼】文心一言 VS ChatGPT-4

摘要:本文将对比分析两款知名的 AI 对话引擎:文心一言和 OpenAI 的 ChatGPT,通过实际案例让大家对这两款对话引擎有更深入的了解,以便大家选择合适的 AI 对话引擎。 亲爱的 CSDN 朋友们,大家好!近年来&…...

美团笔试-3.18

1、捕获敌人 小美在玩一项游戏。该游戏的目标是尽可能抓获敌人。 敌人的位置将被一个二维坐标 (x, y) 所描述。 小美有一个全屏技能,该技能能一次性将若干敌人一次性捕获。 捕获的敌人之间的横坐标的最大差值不能大于A,纵坐标的最大差值不能大于B。 现在…...

【12】SCI易中期刊推荐——计算机信息系统(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…...

好不容易约来了一位程序员来面试,结果人家不做笔试题

感觉以后还是不要出面试题这环节好了。好不容易约来了一位程序员来面试。刚递给他一份笔试题,他一看到要做笔试题,说不做笔试题,有问题面谈就好了,搞得我有点尴尬,这位应聘者有3年多工作经验。关于程序员岗位&#xff…...

这几个过时Java技术不要再学了

Java 已经发展了近20年,极其丰富的周边框架打造了一个繁荣稳固的生态圈。 Java现在不仅仅是一门语言,而且还是一整个生态体系,实在是太庞大了,从诞生到现在,有无数的技术在不断的推出,也有很多技术在不断的…...

EEPROM芯片(24c02)使用详解(I2C通信时序分析、操作源码分析、原理图分析)

1、前言 (1)本文主要是通过24c02芯片来讲解I2C接口的EEPROM操作方法,包含底层时序和读写的代码; (2)大部分代码是EEPROM芯片通用的,但是其中关于某些时间的要求,是和具体芯片相关的,和主控芯片和外设芯片都有关系&…...

Django4.0新特性-主要变化

Django 4.0于2021年12月正式发布,标志着Django 4.X时代的来临。参考Django 4.0 release notes | Django documentation | Django Python 兼容性 Django 4.0 将支持 Python 3.8、3.9 与 3.10。强烈推荐并且仅官方支持每个系列的最新版本。 Django 3.2.x 系列是最后…...

MySQL高级面试题整理

1. 执行流程 mysql客户端先与服务器建立连接Sql语句通过解析器形成解析树再通过预处理器形成新解析树,检查解析树是否合法通过查询优化器将其转换成执行计划,优化器找到最适合的执行计划执行器执行sql 2. MYISAM和InNoDB的区别 MYISAM:不支…...

【Java】面向对象三大基本特征

【Java】面向对象三大基本特征 1.封装 On Java 8:研发程序员开发一个工具类,该工具类仅向应用程序员公开必要的内容,并隐藏内部实现的细节。这样可以有效地避免该工具类被错误的使用和更改,从而减少程序出错的可能。彼此职责划分清晰&#x…...

蓝桥杯C++组怒刷50道真题(填空题)

🌼深夜伤感网抑云 - 南辰Music/御小兮 - 单曲 - 网易云音乐 🌼多年后再见你 - 乔洋/周林枫 - 单曲 - 网易云音乐 18~22年真题,50题才停更,课业繁忙,有空就更,2023/3/18/23:01写下 目录 👊填…...

XML Group端口详解

在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...