【Java开发笔记】分库分表

2023-05-16

【Java开发笔记】分库分表

1 分库分表基本概述

为什么要分库分表?

【性能角度】分库分表就是为了解决由于数据量多大而导致数据库性能下降的问题:

  • 原来独立的数据库拆分成若干数据库组成
  • 将原来的大表(存储近千万数据)拆分为若干小表

目的:使得单一数据库、单一数据表的数据量变小,从而提升数据库性能。

【可用性角度】防止单机故障

2 分库分表的方式

分库分表包含了分库、分表两部分。在生产中通常包括:垂直分库、水平分库、垂直分表、水平分表

2.1 垂直分表

定义:将一个表按照字段分成多个表,每个表存储其中一部分字段

场景:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能

如下图,是一个记录商品信息的表,共包含五个字段(商品ID商品名称商品价格商品图片商品描述

image-20230212160844072

在实际的项目当中,展现给用户次数最频繁的字段应该是 商品名称、图片以及价格 等;而对于 商品描述 的信息,只有在用户对商品感到有兴趣并进行点击详情的操作时,用户才会看到该字段的信息。因此在这种情境下,我们可以将 商品描述 这种占用空间较多,但访问不频繁的字段单独拆开来

image-20230212160926638

像上图所示,将 商品描述 字段,拆开成为另一个表作为辅助表,并且在拆分出来的表中,增加一个记录主表主键ID的字段,当用户对该商品感兴趣并点击查看详情时,就可以主表的主键与该字段匹配,找到对应的 商品描述,并呈现给用户。

优点

  1. 充分发挥了热门数据的操作效率,商品信息的高效率操作的效率不会被商品描述等低效率所拖累(数据冷热分离
  2. 避免了IO过度争抢并减少锁表的几率,查看详情的用户与商品信息浏览互不影响

原则

  1. 冷热数据分离:将不常用的字段单独放在一张表
  2. 大字段拆分:把 text(大文本存储),blob(图片、视频类存储)等大字段拆分出来放在附表中
  3. 避免多表联查:经常组合查询的列放在一张表中,提高效率

2.2 垂直分库

通过 垂直分表 性能确实能够得到一定的提升,但是因为 存储的数据始终限制在一台服务器上,服务器的物理硬件存在性能瓶颈(如:IO、磁盘、CPU等),而通过库内垂直分表只解决了单一表数据量过大的问题,但没有将表分布到不同服务器上,因此每个表还是竞争同一个物理机的 CPU、内存、IO等。

定义:垂直分库是指 按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上

核心思想:专库专用

例如,在一个库中,存在四张表:地理区域店铺信息商品信息商品描述

基于垂直分库的思想,我们把关于商品类的表(商品信息商品描述)单独放在一个库中(部署到服务器1),把 店铺信息 表放入另一个库中(部署到服务器2),而 地理区域 表属于公共表。

image-20230212165611448

优点

  1. 便于维护:通过不同的表的业务聚合(聚合为库),使得数据库的维护更加清晰
  2. 便于管理:能够对不同业务的数据进行分级管理、维护、监控、扩展等
  3. 分摊访问压力:高并发的场景下,垂直分库一定程度上提高了磁盘 IO 和数据库连接数,并改善了单机硬件资源的瓶颈问题

但是,垂直分库并没有解决但表数据量过大的问题!

2.3 水平分库

功能:解决了 单库 数据量过大问题

定义:把同一个表的数据按照一定规则拆分到不同的数据库中,每个库可以放在不同服务器上

经过垂直分库后,数据库性能问题得到一定程度的解决,但是随着业务量的增长,PRODUCT_DB(商品库) 单库存储数据已经超出预估。粗略估计,目前有 8w 店铺,每个店铺平均 150 个不同规格的商品,再算上增长,那商品数量得往 1500w+ 上预估,并且 PRODUCT_DB(商品库) 属于访问 非常频繁 的资源,单台服务器已经无法支撑。此时该如何优化?
可尝试水平分库,将店铺 ID 为单数的和店铺 ID 为双数的商品信息分别放在两个库中。

image-20230212165631005

通过水平分库后,各个库保存的表结构是一样的,但表中的内容是不一样的

优点

  1. 解决了单库大数据、高并发的性能瓶颈问题
  2. 提高了系统的稳定性和可用性

但是,由于同一个表被分配在不同的数据库,需要额外进行数据操作的路由工作,因此大大提升了系统的复杂度。

2.4 水平分表

解决 单表 数据量大的问题

定义:在同一个数据库内,把同一个表的数据按照一定规则拆分到多个表中

按照水平分库的思路对他把 PRODUCT_DB_X(商品库) 内的 表也可以进行水平拆分其目的也是为解决单表数据量大的问题

image-20230212170504444

优点

  1. 优化单一表数据量过大而产生的性能问题
  2. 避免IO争抢并减少锁表几率

3 分库分表带来引发的问题

3.1 事务一致性问题

分库 可能 导致执行一次事务所需的数据分布在 不同服务器上,数据库层面无法实现事务性操作,需要更上层业务引入分布式事务操作,难免会给业务带来一定复杂性,那么要想解决事务一致性问题一般有两种手段:

  • 方案一:在进行分库分表方案设计过程中,从业务角度出发,尽可能保证一个事务所操作的表分布在一个库中,从而实现数据库层面的事务保证。
  • 方案二:方式一无法实现的情况下,业务层引入分布式事务组件保证事务性,如事务性消息、TCC、Seata等 分布式事务 方式实现数据最终一致性。

3.2 跨库聚合查询问题

分库分表会导致常规聚合查询操作,如 group byorder by 等变的异常复杂。需要复杂的业务代码才能实现上述业务逻辑,其常见操作方式有:

  • 方案一:赛道赛马机制,每次从 N 个库表中查询出 TOP N 数据,然后在 业务层代码中进行聚合合并操作
  • 方案二:可以将经常使用到 groupbyorderby 字段存储到一个单一库表(可以是REDIS、ES、MYSQL)中,业务代码中先到单一表中根据查询条件查询出相应数据,然后根据查询到的主键 ID,到分库分表中查询详情进行返回。2次查询操作难点会带来接口耗时的增加,以及极端情况下的数据不一致问题。

3.3 主键(自增ID)唯一性问题

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

  • 自增ID做主键时,设置 自增步长,采用等差数列递增,避免各个库表的主键冲突。但是这个方案仍然无法解决迁库迁表、以及分库分表扩容导致主键 ID 变化问题
  • 主键采用 全局统一 ID 生成机制:如 UUID、雪花算法、数据库号段等方式。

参考

  1. MySQL垂直分表原理讲解:https://blog.csdn.net/weixin_47600880/article/details/120643028
  2. 分库分表:垂直分库、垂直分表、水平分库、水平分表四个概念:https://blog.csdn.net/dgfdhgghd/article/details/128426013
  3. 一文读懂数据库分库分表:https://blog.csdn.net/u013291818/article/details/124191907
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java开发笔记】分库分表 的相关文章

  • 20220806 美团笔试五道编程题(附AK题解)

    恭喜发现宝藏 xff01 微信搜索公众号 TechGuide 回复公司名 xff0c 解锁更多新鲜好文和互联网大厂的笔经面经 作者 64 TechGuide 全网同名 点赞再看 xff0c 养成习惯 xff0c 您动动手指对原创作者意义非凡
  • Ubuntu入门(二) 用户权限 文件权限 磁盘管理 连接文件

    目录 1 用户权限管理1 1 用户系统1 2 创建用户和用户组命令1 3 权限管理1 4 权限管理命令 2 磁盘管理2 1 磁盘管理基本概念2 2 磁盘管理命令 3 连接文件3 1 硬连接3 2 符号连接 xff08 软连接 xff09 1
  • git clone指定分支代码

    全克隆 xff1a span class token function git span clone span class token operator lt span url span class token operator gt sp
  • Kali Linux 镜像 各个版本之间的区别

    按处理器架构来划分的话 xff0c 有 64 bit 32 bit armhf armel等版本 加light的是轻量版 e17 Mate LXDE等是不同的桌面环境 Kali Linux 2016 2 支持GNOME KDE Mate L
  • ubuntu16.04下px4环境搭建与固件编译

    px4官网提供了一个批处理方式搭建px4开发环境 xff0c 十分好用 xff0c 按照官网步骤 1 sudo usermod span class hljs a span G dialout span class hljs variabl
  • Top-down与Bottom-up

    简析 顾名思义 xff0c top down是由上至下 xff0c 而bottom up由下至上的意思 其实 xff0c 就我对本行业的理解 xff0c top 61 目的 objective xff0c bottom 61 方法细节 ac
  • MATLAB GPU加速

    以前使用matlab 的时候 xff0c 很多人都用过里面的并行工具箱 xff0c 用的最多的应该就是parfor 实际上 xff0c matlab里面已经有不少工具箱里面都有了支持GPU加速的函数 使用matlab 43 GPU加速的前提
  • 论如何最低成本进入 智能家居、人工智能、安卓主板 的领域

    原创 xff1a http blog csdn net kylin fire zeng xff0c 欢迎转载分享 xff0c 共同进步 xff0c 但请注明出处啊 xff0c 尊重他人成果
  • 为什么说枚举单例模式是最安全的?

    单例模式有很多种 xff0c 如 xff1a 饿汉式 线程安全 xff0c 但是浪费资源 xff1b 懒汉式 懒汉式又分为 xff0c 同步锁单例模式 性能较差 xff1b 双重判断同步锁单例模式 静态内部类单例模式 以上单例模式大多数都是
  • Qt - 信号与槽的连接方式

    信号与槽的连接方式主要有以下5种方式 xff1a 先看代码 xff1a ifndef MYOBJECT H define MYOBJECT H include lt QObject gt class MyObject public QObj
  • vslam流程框架介绍

    平常扫地机产品上经常听说使用了vslam技术 xff0c 那么这个vslam到底是什么呢 xff0c 我们下面一起来看看 vslam是什么 xff1f VSLAM 即 Visual Simultaneous Localization and
  • linux出现oom分析流程

    背景 linux内核有个机制叫OOM killer Out Of Memory killer xff0c 当系统需要申请内存却申请不到时 xff0c OOM killer会检查当前进程中占用内存最大者 xff0c 将其杀掉 xff0c 腾出
  • 浅入浅出linux中断子系统

    浅入浅出linux中断子系统 xff0c 如需深入 xff0c 直接跳转重要参考章节 什么是中断 xff1f 当CPU被某些信号触发 xff0c CPU暂停当前工作 xff0c 转而处理信号的事件 xff0c 简单的称它为中断 xff0c
  • ROS2交叉编译操作

    ROS2移植过程 在移植ROS2之前 先确认需要移植的版本以及其对应的依赖 这些信息可以在 ROS 2 Releases and Target Platforms 中有介绍 可依据自身需要使用的平台 参考该链接进行选择 下面以ROS2 Hu
  • gstreamer学习笔记---pad定义、连接、流动

    pad相当于element的接口 xff0c 各个element就是通过pad连接进行传输数据 xff0c 同时pad会通过caps限制特定的数据类型通过 xff0c 只有当两个pad的caps数据类型一致时才可以建立连接 那么pad在el
  • gstreamer学习笔记---gst-omx

    一 openMAX理解1 gst omx是基于openMAX开发的插件 xff0c 所以在介绍gst omx之前 xff0c 我们先了解一下openMAX openMAX xff1a open media acceleration xff0
  • csi mipi信号解析

    1 传输模式 LP xff08 Low Power xff09 模式 xff1a 用于传输控制信号 xff0c 最高速率 10 MHz HS xff08 High Speed xff09 模式 xff1a 用于高速传输数据 xff0c 速率
  • 程序调试方法

    记录初衷 xff1a 遇到问题 xff0c 按照一套方法 xff0c 把问题化解 xff0c 逐渐的内化为心法 xff0c 形成经验 xff0c 这就是成长的过程 就好比吃的猪肉 xff0c 经过消化 分解 吸收后变成了自己肉 程序分为三种
  • 博客八:基于xr871实现wifi音响产品

    原创 xff1a http blog csdn net kylin fire zeng xff0c 欢迎转载分享 xff0c 共同进步 xff0c 但请注明出处啊 xff0c 尊重他人成果
  • 用 Docker 部署一个 Python 应用

    Flask项目 这里为了演示的方便 xff0c 我们就写一个简单的Flask项目 xff0c 代码如下 from flask import Flask app 61 Flask name 64 app route 39 39 def ind

随机推荐

  • Realsence D455标定并运行Vins-Fusion

    文章目录 一 双目相机标定1 标定板准备1 1 打印标定板1 2 标定板信息原始pdf的格子参数是 xff1a 调整后的格子参数是 xff1a 2 左右目相机数据准备2 1 修改rs camera launch内容2 2 关闭结构光2 3
  • 【Linux命令】文件和目录权限

    Linux命令 文件和目录权限 权限查看 众所周知 xff0c 可以使用 ls l 来查看文件和目录的详细信息 xff0c 那么输出的东西是什么呢 xff1f 我们先来看 文件类型 xff1a xff1a 普通文件 xff1b d xff1
  • 【设计模式】单例模式

    设计模式 单例模式 1 为什么要用单例 xff1f 单例设计模式 xff08 Singleton Design Pattern xff09 xff1a 一个类只允许创建一个对象 xff08 或实例 xff09 1 1 处理资源访问冲突 例如
  • 【JAVA】基础语法

    JAVA 基础语法 JAVA面向对象三大特征 封装 继承 多态 1 类型转换 1 1 自动类型转换 自动类型转换 类型范围小的变量 可以直接赋值给类型范围大的变量 1 2 表达式的自动类型转换 在表达式中 小范围类型的变量会自动转换成当前较
  • 【Java技巧】如何在HashMap中插入重复的key?

    Java技巧 如何在HashMap中插入重复的key xff1f 问题引出 我们都知道 xff0c Map 的 key 需要保证唯一性 插入重复的 key 会被最后插入的 key 所覆盖 xff0c 如 xff1a span class t
  • ArrayList源码分析

    ArrayList源码分析 注意 本笔记分析对象为 Java8 版本 随版本不同 源码会发生变化 1 ArrayList类图与简介 ArrayList是一个 非线程安全 基于数组实现的一个动态数组 可以看到 它的顶层接口是 Collecti
  • Vector源码分析

    Vector源码分析 1 Vector基本介绍与类图 Vector 类实现了一个动态数组 和 ArrayList 很相似 但是两者是不同的 Vector 是同步访问的 Vector 包含了许多传统的方法 这些方法不属于集合框架 Vector
  • LinkedList源码分析

    LinkedList源码分析 注意 本笔记分析对象为 Java8 版本 随版本不同 源码会发生变化 基本介绍与类图 LinkedList 同时实现了 List 接口和 Deque 对口 也就是收它既可以看作一个顺序容器 又可以看作一个队列
  • 【网管日记】Linux防火墙操作

    网管日记 Linux防火墙操作 记录一下常用的Linux防火墙操作 xff1a 查看防火墙状态 systemctl status firewalld 或 firewall cmd state暂时关闭防火墙 systemctl stop fi
  • (毕业设计资料)基于51单片机的智能窗控制系统设计

    实现参考功能 1 可实时显示年月日 时分秒 光照强度和控制模式 xff1b 2 可通过手动控制窗帘的开启和关闭 xff1b 3 可通过设置开启和关闭时间来控制窗帘 xff1b 4 可通过检测光照强度的亮暗来控制窗帘 xff1b 5 使用步进
  • 网络操作系统 第十二章 FTP服务器的安装与配置

    习题 1 简述FTP的连接模式 FTP的连接模式有PORT和PASV两种 xff0c 其中PORT模式是主动模式 xff0c PASV是被动模式 xff0c 这里所说的主动和被动都是相对于服务器而言的 如果是主动模式 xff0c 数据端口为
  • 【网管日记】MySQL主从复制

    MySQL主从复制 基本介绍 MySQL 主从复制是一个异步的复制过程 xff0c 底层是基于 Mysql 数据库自带的 二进制日志 功能 一台或多台 MySQL 数据库 xff08 slave xff0c 即 从库 xff09 从另一台
  • 【网管日记】Nginx基本介绍、安装与使用

    Nginx基本使用 基本介绍 Nginx是一款轻量级的Web服务器 反向代理服务器及电子邮件 xff08 IMAP POP3 xff09 代理服务器 其特点是 占用内存少 xff0c 并发能力强 xff0c 事实上nginx的并发能力在同类
  • 【网管日记】Nginx报错踩坑记录

    网管日记 Nginx报错踩坑记录 1 防火墙没关闭 自启 error 21113 0 21 connect failed 113 No route to host while connecting to upstream 解决方法 xff1
  • 【数据结构与算法】Manacher算法

    Manacher算法 https github com SongJianHIT DataStructurs Algorithm tree main src algorithms manacher 基本介绍 Manacher 算法常用于 求一
  • 【数据结构与算法】DP路径问题

    问题 xff1a 最小路径和 给定一个包含非负整数的 m x n 网格 grid xff0c 请找出一条从左上角到右下角的路径 xff0c 使得路径上的数字总和为最小 说明 xff1a 每次只能向下或者向右移动一步 示例 1 xff1a 输
  • 【Java开发】Dependency ‘XXX‘ not found

    Java开发 Dependency XXX not found 在配置 pom 文件时 xff0c 遇到 Dependency 39 com google guava guava 30 0 jre 39 not found 方法一 xff1
  • 【Mysql】日期函数总结

    Mysql 日期函数总结 1 获取日期时间函数 1 1 获取当前日期时间 span class token keyword SELECT span span class token function NOW span span class
  • 【Java开发笔记】线程池

    Java开发笔记 线程池 线程池 ThreadPoolExecutor 的七大核心参数 xff1a 核心线程数 corePoolSize最大线程数 maxinumPoolSize超过核心线程数的闲余线程存活时间 keepAliveTime存
  • 【Java开发笔记】分库分表

    Java开发笔记 分库分表 1 分库分表基本概述 为什么要分库分表 xff1f 性能角度 分库分表就是为了解决由于数据量多大而导致数据库性能下降的问题 xff1a 原来独立的数据库拆分成若干数据库组成将原来的大表 xff08 存储近千万数据