分库分表方式介绍

分库分表方式

分库分表包括分库和分表两个部分,在生产中通常包括:垂直分库、水平分库、垂直分表、水平分表四种方式;

1、垂直分表

1.1 垂直分表定义

  • 垂直分表就是在同一数据库内将一张表按照指定字段分成若干表,每张表仅存储其中一部分字段;
  • 垂直分表拆解了原有的表结构,拆分的表之间一般是一对一的关系;

1.2 垂直分表场景示例

在这里插入图片描述

1.2.1 场景说明

下边通过一个商品查询的案例讲解垂直分表,通常在商品列表中是不显示商品详情信息的,如下图:

说明:

  • 用户浏览商品列表时只对感兴趣商品查看商品详情:商品描述信息被访问的频次较低,且该字段占用存储空间较大
  • 商品表字段出现部分字段访问频次不一致的情况:商品名称、商品图片、商品价格等其他字段数据访问频次较高

由于这两组数据的特性不一样,因此我们可以考虑将商品信息表拆分如下,将访问频次低的商品描述信息单独存放在一张表中,访问频次较高的商品基本信息单独放在一张表中

商品列表可采用以下sql:

SELECT p.*,r.[地理区域名称],s.[店铺名称],s.[信誉]
FROM [商品信息] p 
LEFT JOIN [地理区域] r ON p.[产地] = r.[地理区域编码]
LEFT JOIN [店铺信息] s ON p.id = s.[所属店铺]
WHERE...ORDER BY...LIMIT...

需要获取商品描述时,再通过以下sql获取:

SELECT *
FROM [商品描述] 
WHERE [商品ID] = ?
1.2.2 垂直分表优势
  • 充分提高了热点数据的操作效率,商品信息的操作的高效率不会被商品描述的低效率所拖累(冷热数据分离);
  • 避免了IO过度争抢并减少锁表的几率,查看商品详情的用户与商品信息浏览互不影响;
1.2.3 垂直分表原则
  • 把不常用的字段单独放在一张表;(因为数据库加载数据时,会将表整整行的信息加载)
  • 把text(大文本存储),blob(图片、视频类存储)等大字段拆分出来放在附表中(阿里开发手册严禁使用text等大字段);
  • 经常组合查询的列放在一张表中,避免多表联查,性能最高;

2、垂直分库

2.1 垂直分表存在的问题

  • 经过垂直分表后表的查询性能确实得到了一定程度的提升,但数据始终限制在同一台机器内,因此因此每个表还是竞争同一个物理机的CPU、内存、网络IO、磁盘;
  • 单台服务器的性能瓶颈(比如:CPU、内存、网络IO、磁盘等)通过垂直分表始终得不到突破;

2.2 垂直分库定义

​ 垂直分库是指按照业务将表进行归类,然后把不同类的表分布到不同的数据库上面,而每个库又可以放在不同的服务器上,它的核心理念是-专库专用

2.3 示例场景

经过思考,我们可以将原有的卖家库,拆分为分为商品库和店铺库,并把这两个库分散到不同服务器上,

注意事项:

由于商品信息与商品描述业务耦合度较高,因此一起被存放在商品库(避免跨库联查);
店铺信息相对独立,因此可单独被存放在店铺库下;
对于地理区域表,因为商品信息和店铺信息都需要,且地理区域是不经常变动的常量表但是会存在与其他表联查的情况,所以可以将它作为公共表分别等量部署到不同的数据库节点下;
以上操作就可以称为垂直分库。

2.4垂直分库优势

垂直分库带来的提升是:

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

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

3、 水平分表

3.1水平分表定义

  • 水平分表就是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中,表的结构没有变化;
  • 水平分表解决单表数据量大的问题;

3.2 水平分表示例

为解决单表数据量大的问题,我们可把商品库内的表进行水平拆分,得到若干相同表结构的小表;

需要注意的是各个小表存储的数据不同,且数据依旧保存在同一个数据库内;

分表算法说明:

如果商品ID为双数,将此操作映射至商品信息1表;如果商品ID为单数,将操作映射至商品信息2表。此操作要访问表名称的表达式为商品信息[商品ID%2 + 1];

这种操作就叫做:水平分表。

3.3 水平分表优势

水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中,它带来的提升是:

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

整体看,水平分表仅仅解决了单表数据量过大的问题,但是没有解决单库数据量过大的问题;

4、水平分库

4.1 水平分库定义

  • 水平分库可以看做是水平分表的进一步拆分,是把同一个表的数据按一定规则拆到不同的数据库中,每个库又可以部署到不同的服务器上;
  • 水平分库解决了单库数据量大的问题,突破了服务器物理存储的瓶颈;

4.2 水平分库示例场景

​ 经过垂直分库和水平分表后,数据库性能问题得到一定程度的解决,但是随着业务量的增长,商品库单库存储数据已经超出预估。

假如当前有8w店铺,每个店铺平均150个不同规格的商品,那商品数量得往1200w+上预估,并且商品库属于访问非常频繁的资源,单台服务器已经无法支撑

此时该如何优化?

​ 目前情况是那怕再次垂直分库也无法解决数据瓶颈问题。我们可以尝试水平分库,将商品ID为单数的和商品ID为双数的商品信息分别放在两个不同库中;

说明:

如果商品ID为双数,将此操作映射至【商品库-1】;
如果店铺ID为单数,将操作映射至【商品库-2】;
此操作要访问数据库名称的表达式为:商品库_(商品ID%2 + 1);
这种操作就叫水平分库。
总之,水平分库后,各个库保存的表结构是一致的,但是表中内容不一样;

4.3 水平分库优势

水平分库带来的提升是:

  • 解决了单库大数据,高并发的性能瓶颈问题;
  • 提高了系统的稳定性及可用性;

总之,当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平分库了,经过水平切分的优化,往往能解决单库存储量及性能瓶颈。但由于同一个表被分配在不同的数据库,需要额外进行数据操作的路由工作,因此大大提升了系统复杂度。

5、分库分表带来的问题

分库分表能有效的缓解了单机和单库带来的性能瓶颈和压力,突破网络IO、硬件资源、连接数的瓶颈,同时也带来了一些问题。

  • 分布式事务一致性问题
  • 跨节点关联查询
  • 跨节点分页、排序函数
  • 主键避重
  • 公共表(小数据量的表且经常使用,可能存在联查的情况)

显然如果我们自己去解决上述问题,开发工作量较大,所以我们就有必要学习一种支持分库分表特性的技术:sharding-jdbc、mycat等;

6、分库分表小结

分库分表方式:垂直分表、垂直分库、水平分库和水平分表

**垂直分表:**可以把一个宽表的字段按访问频次、是否是大字段的原则拆分为多个表,这样既能使业务清晰,还能提升部分性能。拆分后,尽量从业务角度避免联查,否则性能方面将得不偿失【同一库中将单张表按照字段拆分成若干表,拆分后表的记录行数不变】。

**垂直分库:**可以把多个表按业务耦合松紧归类,分别存放在不同的库,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能,同时能提高整体架构的业务清晰度,不同的业务库可根据自身情况定制优化方案。但是它需要解决跨库带来的所有复杂问题。 【根据业务将表分组形成不同的库,这些库又可以部署到不同的数据库中-专库专用

**水平分表:**可以把一个表的数据(按数据行)分到多个同一个数据库的多张表中,每个表只有这个表的部分数据,这样做能小幅提升性能,它仅仅作为水平分库的一个补充优化。【同一数据库中将大表拆分成若干小表,每张表的结构一致,但保存的数据不同

水平分库:可以把表的数据(按数据行)分 到多个不同的库,每个库只有这个表的部分数据,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能。它不仅需要解决跨库带来的所有复杂问题,还要解决数据路由的问题(数据路由问题后边介绍)。

最佳实践:

一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案。当然在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库水平分表方案。

总之,基于开发和维护成本比考虑,非必须,不要对数据库做分库分表处理!

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

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

相关文章

Unity中实现预制体自动巡逻与攻击敌人的完整实现指南

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

wireshark 解密浏览器https数据包

一、导出浏览器证书有两种方法 1、在浏览器快捷方式追加启动参数: --ssl-key-log-file"d:\log\2.log" C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe --ssl-key-log-file"d:\log\2.log" 2、环境变量中新建用…

整理—计算机网络

目录 网络OSI模型和TCP/IP模型 应用层有哪些协议 HTTP报文有哪些部分 HTTP常用的状态码 Http 502和 504 的区别 HTTP层请求的类型有哪些? GET和POST的使用场景,有哪些区别? HTTP的长连接 HTTP默认的端口是什么? HTTP1.1怎…

win10卸载软件后发现“应用和功能”中还残留着软件卸载项怎么办?

win10卸载软件后发现“应用和功能”中还残留着软件卸载项怎么办? 1、方法一:2、方法二:3、在 Windows 中卸载或删除应用和程序 1、方法一: 点击控制面板界面中的程序下方的删除程序。 2、方法二: 1.winR打开运行窗…

JAVA——IO流

目录 1.概述 字节流: 2.分类 3.输入文件数据 1.创建对象 2.写出数据 3.释放资源 4.读出文件数据 1.创建对象 2.读取数据 3.释放资源 5.字符集 a.ASCII b.GBK c.Unicode 6.乱码 7.编码、解码常见方法 a.编码方法 1.默认方式编码 2.指定方式编码 …

4.7 大数据应用场景

文章目录 今天,我非常荣幸能与大家分享一个充满潜力和变革的主题——大数据的应用场景。在这个信息爆炸的时代,大数据已经成为推动各行各业发展的重要驱动力。接下来,我将带领大家探索大数据在不同行业中的神奇应用。 首先,让我们…

Wed前端入门——HTML、CSS

Wed前端入门——HTML、CSS 一般的页面有HTML、CSS以及JavaScript组成 HTML定义了页面的结构和内容&#xff0c;包括文本、图像、链接等等CSS用于定义页面的布局和样式JS用于添加交互性和动态功能作用 一、HTML 基本格式&#xff1a; <!-- 文档类型为HTML --> <!D…

大语言模型实战教程首发:基于深度学习的大规模自然语言处理模型LLM详解 -Shelly

我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 大模型的热度&#xff0c;实在是很高&#xff0c;诺奖也颁给了…

读书笔记《有效需求分析》业务场景梳理

1. 关键思考链 2. 执行流程 3. 执行细则 1&#xff09;最重要的是从业务流程到业务场景的梳理。 2&#xff09;主、变、支、管流程&#xff08;待解读&#xff09; 3&#xff09;排序业务场景&#xff08;待分析&#xff09; 4&#xff09;各分支判断是独立的且需要系统支持&a…

Vite创建Vue3项目以及Vue3相关基础知识

1.创建Vue3项目 1.运行创建项目命令 # 使用 npm npm create vitelatest2、填写项目名称 3、选择前端框架 4、选择语法类型 5、按提示运行代码 不出意外的话&#xff0c;运行之后应该会出现 下边这个页面 6.延伸学习&#xff1a;对比webpack和vite&#xff08;这个是面试必考…

JVM(HotSpot):直接内存及其使用建议

文章目录 一、什么是直接内存&#xff1f;二、特点三、使用案例四、直接内存的管理 一、什么是直接内存&#xff1f; Direct Memory&#xff1a;系统内存 普通IO&#xff0c;运行原理图 磁盘到系统内存&#xff0c;系统内存到jvm内存。 NIO&#xff0c;运行原理图 划分了一块…

Webpack 完整指南

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Webpack篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来webpack篇专栏内容:webpack介绍 目录 介绍 一、webpack 1.1、webpack是什么 1.2 webpack五个核心配置 1.…

FreeRTOS——中断管理

中断理论剖析 中断简介 中断是一种机制&#xff0c;用于处理高优先级的事件或故障。当一个中断事件发生时&#xff0c;单片机可以立即中断正在执行的程序&#xff0c;转而处理中断事件。这种机制可以提高系统的响应速度和实时性。 中断优先级分组设置 ARM Cortex-M使用了8位宽…

它思科技CTO聂玮奇:消除“AI幻觉”,搭建高可靠对话云平台丨数据猿专访

大数据产业创新服务媒体 ——聚焦数据 改变商业 近年来&#xff0c;大模型技术在全球范围内引起了广泛关注和应用热潮。 提到人工智能&#xff0c;很多人会想到它强大的运算能力和广泛的应用场景。如今&#xff0c;语言模型的发展如火如荼&#xff0c;但其中的“幻觉”问题却带…

川字结构布局/国字结构布局

1.串字结构布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style&g…

S7-200 SMART 与 S7-1200 之间 TCP 通信— S7-200 SMART 作为服务器

TCP 协议通信 TCP 通信为面向连接的通信&#xff0c;需要双方都调用指令以建立连接及交换数据。S7-200 SMART 与 S7-1200 通过 TCP 通信&#xff0c;在 S7-1200 调用 T-block 指令 ( TCON, TDISCON, TSEND, TRCV ) &#xff0c;在 S7-200 SMART 调用 Open User Communication …

网络爬虫-数美滑块验证码

仅供研究学习使用。 今天带来的是数美滑块验证码的逆向 目标站 --> 传送门 解决此类验证码 首先要解决滑动距离的判定 无论是使用selenium还是使用协议的方式来破解 都绕不开滑动距离的识别 滑动距离可以参考以前我博客上的方式&#xff0c;或者找一找开源的一些算法&am…

Go基础知识:切片

数组 Go 数组的大小是固定的&#xff0c;其长度是其类型的一部分&#xff08;[4]int并且[5]int是不同的、不兼容的类型&#xff09; var a [10]intb : [2]string{"Penn", "Teller"} b : [...]string{"Penn", "Teller"}package maini…

2.4 STM32启动过程

目录 一,启动Flow 1.1 初始化MSP 1.2 初始化PC 1.3 设置堆栈大小 1.4初始化中断向量表 1.5 调用初始化函数(可选) 1.6 调用__main 二,Reset_Handler函数 一,启动Flow 下面是stm32在内部FLASH启动的启动建议流程图,在stm32复位到执行我们程序的main函数的过程中,…

深入理解Redis锁与Backoff重试机制在Go中的实现

文章目录 流程图Redis锁的深入实现Backoff重试策略的深入探讨结合Redis锁与Backoff策略的高级应用具体实现结论 在构建分布式系统时&#xff0c;确保数据的一致性和操作的原子性是至关重要的。Redis锁作为一种高效且广泛使用的分布式锁机制&#xff0c;能够帮助我们在多进程或分…