【Java开发笔记】分库分表

news2024/11/15 4:11:43

【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

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

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

相关文章

利用git reflog 命令来查看历史提交记录,并使用提交记录恢复已经被删除掉的分支

一.问题描述 当我们在操作中手误删除了某个分支,那该分支中提交的内容也没有了,我们可以利用git reflog这个命令来查看历史提交的记录从而恢复被删除的分支和提交的内容 二.模拟问题 1.创建git仓库,并提交一个文件 [rootcentos7-temp /da…

oracle10g安装教程

oracle 10g 安装 环境 操作系统:win 7 64位 内存:8G Oracle 10压缩包:10203_vista_w2k8_x86_production_db.zip 客户端:Oracle_client_win32.zip pl/sql:plsqldev1005.exe 背景 Oracle是众多中大型企业必选的数…

17万字数字化医院信息化建设大数据平台建设方案WORD

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容: 目录 第1章 医院信息化概述 1.…

MySQL-数据目录浅析

InnoDB 、 MyISAM 这样的存储引擎都是把表存储在磁盘上的,操作系统用文件系统来管理磁盘。 数据目录 MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目…

JVM学习02:内存结构

JVM学习02:内存结构 1. 程序计数器 1.1、定义 Program Counter Register 程序计数器(寄存器) 作用:是记住下一条jvm指令的执行地址 特点: 是线程私有的不会存在内存溢出 1.2、作用 程序计数器物理上是由寄存器来实…

Spring中IOC框架结构是什么?都包含那些模块,各个模块具体是什么样的

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用! 7.自定义Spring框架 7.1 Spring框架使用回顾 7.1.1 数据访问层 定义UserDaoMapper接口及实现类 public interface UserMapper { public void add(); } pu…

k8s默认StorageClass,解决pvc一直处于“Pending”

文章目录报错详情排查思路查看 pvc 详细属性查看 nfs-provisioner pod日志解决方案报错详情 排查思路 查看 pvc 详细属性 [rootk8s-master01 /opt/zadig]# kubectl describe pvc pvc-sc Name: pvc-sc Namespace: default StorageClass: nfs-yinwu Status: …

代码随想录算法训练营第27天|● 93.复原IP地址 ● 78.子集 ● 90.子集II

93.复原IP地址 看完题后的思路 典型分割问题略lue略剪枝条件 sub&#xff1a; 1&#xff09; 不是一位首字母为0 2&#xff09;大于三位 3&#xff09;介于0-255之间 4) 当已分割得到3个时&#xff0c;第四个直接从startIndex到末尾就行 代码 ArrayList<String> slist…

剑指Offer 第28天 复杂链表的赋值

复杂链表的复制_牛客题霸_牛客网 描述 输入一个复杂链表&#xff08;每个节点中有节点值&#xff0c;以及两个指针&#xff0c;一个指向下一个节点&#xff0c;另一个特殊指针random指向一个随机节点&#xff09;&#xff0c;请对此链表进行深拷贝&#xff0c;并返回拷贝后的头…

(免费分享)基于 SpringBoot 的高校宿舍管理系统带论文

项目描述 系统代码质量高&#xff0c;功能强大&#xff0c;带论文。 系统的功能主要有&#xff1a; &#xff08;1&#xff09;基本信息管理 基本信息分为学生信息和宿舍信息两部分&#xff0c;其功能是负责维护这些信息&#xff0c;对 它们进行增删查改等操作。 &#x…

UART通讯简介

UART全称Universal AsynchronousReceiver/Transmitter&#xff0c;通用异步收发传输器。 一、工作原理 和其它串口一样&#xff0c;数据按照二进制从低位到高位一位一位的传输&#xff0c;能将要传输的数据在串行通信与并行通信之间加以转换&#xff0c;能够灵活地与外部设备进…

网络编程(未完待续)

网络编程 文章目录网络编程前置概念1- 字节序高低地址与高低字节高低地址&#xff1a;高低字节字节序大端小端例子代码判断当前机器是大端还是小端为何要有字节序字节序转换函数需要字节序转换的时机例子一例子二2- IP地址转换函数早期(不用管)举例现在与字节序转换函数相比:**…

Open Street Map—2023年水系数据

之前文章我们给大家分享了从OSM地图下载的道路数据&#xff08;可查看之前推送的文章&#xff09;&#xff0c; 这一篇我们给大家带来的是从OSM地图下载的水系数据&#xff01;我们下载了全国范围&#xff08;包括港澳台&#xff09;的水系数据&#xff0c;下载时间为2023年2月…

硬件篇-配置

写在最前 这已经可以成为垃圾佬配置了。。。 机箱->239元 机箱选用的itx迷你机箱&#xff0c;为了后期nas方便拓展选了4盘位&#xff0c;该机箱还是比较符合我的预期的&#xff0c;颇有种麻雀虽小五脏俱全的感觉&#xff0c;机箱可以安装matx主板和itx主板&#xff0c;还是…

聊聊MySQL中的事务,MVCC

事务我们知道&#xff0c;事务具有四大特性——ACIDA atomicity 指的是原子性C consistency 指的是一致性I isolation 指的是隔离性D durability 指的是持久性四大特性的实现原理原子性原子性在这指的是整个事务操作&#xff0c;要么同时成功要么同时失败。让它变成一个整体。同…

若依管理系统搭建运行环境--基于SpringBootVue前端分离版

若依框架搭建运行环境-如何下载一、技术支持&#xff1a;二、Redis安装及运行三 目录结构四、导入数据库五 修改配置文件1.application-druid.yml文件 &#xff08;路径&#xff1b;RuoYi-Vue-master\ruoyi-admin\src\main\resources\application-druid.yml&#xff09;2.appli…

越界访问数组

越界访问是指访问&#xff08;操作修改&#xff09;了不属于自己的空间 我们以如下代码为例&#xff1a;此代码在vs中进行 #include <stdio.h> int main() {int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i<12; i){arr[i] 0;printf("hello\n");}r…

阿里云平台与MQTTX软件通信

阿里云平台与MQTTX软件通信 上一篇文章介绍了如何创建阿里云物联网平台以及MQTT.fx软件通信配置&#xff1a;https://blog.csdn.net/weixin_46251230/article/details/128993864 但MQTT.fx软件需要许可证才能使用&#xff0c;所以使用另一款软件MQTTX来代替 MQTTX软件下载 官…

【C++】类与对象(二)

前言 在前一章时我们已经介绍了类与对象的基本知识&#xff0c;包括类的概念与定义&#xff0c;以及类的访问限定符&#xff0c;类的实例化&#xff0c;类的大小的计算&#xff0c;以及C语言必须传递的this指针&#xff08;C中不需要我们传递&#xff0c;编译器自动帮我们实现&…

CSP-《I‘m stuck!》-感悟

题目 做题过程 注&#xff1a;黄色高亮表示需要注意的地方&#xff0c;蓝色粗体表示代码思路 好久没有写过代码了&#xff0c;今天做这道编程题&#xff0c;简直是灾难现场。 上午编程完后发现样例没有通过&#xff0c;检查发现算法思路出现了问题&#xff1a;我计数了S不能到…