java八股文面试[数据库]——分库分表

news2024/9/30 9:23:24
什么是分库分表

简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。

image.png

  • 分库分表解决的问题

    分库分表的目的是为了解决由于数据量过大而导致数据库性能降低的问题,将原来单体服务的数据库进行拆分.将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。

  • 什么情况下需要分库分表
    • 单机存储容量遇到瓶颈.

    • 连接数,处理能力达到上限.

注意:

分库分表之前,要根据项目的实际情况 确定我们的数据量是不是够大,并发量是不是够大,来决定是否分库分表.

数据量不够就不要分表,单表数据量超过1000万或100G的时候, 速度就会变慢(官方测试),

分库分表包括: 垂直分库、垂直分表、水平分库、水平分表 四种方式。
垂直分库
  • 数据库中不同的表对应着不同的业务,垂直切分是指按照业务的不同将表进行分类,分布到不同的数据库上面

    • 将数据库部署在不同服务器上,从而达到多个服务器共同分摊压力的效果

    image.png

垂直分表

表中字段太多包含大字段的时候,在查询时对数据库的IO、内存会受到影响,同时更新数据时,产生的binlog文件会很大,MySQL在主从同步时也会有延迟的风险

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

  • 对职位表进行垂直拆分, 将职位基本信息放在一张表, 将职位描述信息存放在另一张表

image.png

  • 垂直拆分带来的一些提升

    • 解决业务层面的耦合,业务清晰

    • 能对不同业务的数据进行分级管理、维护、监控、扩展等

    • 高并发场景下,垂直分库一定程度的提高访问性能

  • 垂直拆分没有彻底解决单表数据量过大的问题

水平分库
  • 将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO连接数硬件资源等的瓶颈.

  • 简单讲就是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面, 例如将订单表 按照id是奇数还是偶数, 分别存储在不同的库中。

    image.png

水平分表
  • 针对数据量巨大的单张表(比如订单表),按照规则把一张表的数据切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。

    image.png

  • 总结

    • 垂直分表: 将一个表按照字段分成多表,每个表存储其中一部分字段。

    • 垂直分库: 根据表的业务不同,分别存放在不同的库中,这些库分别部署在不同的服务器.

    • 水平分库: 把一张表的数据按照一定规则,分配到不同的数据库,每一个库只有这张表的部分数据.

    • 水平分表: 把一张表的数据按照一定规则,分配到同一个数据库的多张表中,每个表只有这个表的部分数据.

水平分库分表策略

分库分表策略一般有几种,使用与不同的场景:

  • range范围

  • hash取模

  • range+hash取模混合

1 range范围

range,即范围策略划分表。比如我们可以将表的主键,按照从0~1000万的划分为一个表,1000~2000万划分到另外一个表。如下图:

图片

当然,有时候我们也可以按时间范围来划分,如不同年月的订单放到不同的表,它也是一种range的划分策略。

这种方案的优点:

  • 这种方案有利于扩容不需要数据迁移。假设数据量增加到5千万,我们只需要水平增加一张表就好啦,之前0~4000万的数据,不需要迁移。

缺点:

  • 这种方案会有热点问题,因为订单id是一直在增大的,也就是说最近一段时间都是汇聚在一张表里面的。比如最近一个月的订单都在1000万~2000万之间,平时用户一般都查最近一个月的订单比较多,请求都打到order_1表啦,这就导致表的数据热点问题。

2 hash取模

hash取模策略:指定的路由key(一般是user_id、订单id作为key)对分表总数进行取模,把数据分散到各个表中。

比如原始订单表信息,我们把它分成4张分表:

图片

  • 比如id=1,对4取模,就会得到1,就把它放到第1张表,即t_order_0;

  • id=3,对4取模,就会得到3,就把它放到第3张表,即t_order_2;

这种方案的优点:

  • hash取模的方式,不会存在明显的热点问题。

缺点:

  • 如果一开始按照hash取模分成4个表了,未来某个时候,表数据量又到瓶颈了需要扩容,这就比较棘手了。比如你从4张表,又扩容成8张表,那之前id=5的数据是在(5%4=1,即第一张表),现在应该放到(5%8=5,即第5张表),也就是说历史数据要做迁移了

3 range+hash取模混合

既然range存在热点数据问题,hash取模扩容迁移数据比较困难,我们可以综合两种方案一起嘛,取之之长,弃之之短。

比较简单的做法就是,在拆分库的时候,我们可以先用range范围方案,比如订单id在04000万的区间,划分为订单库1,id在4000万8000万的数据,划分到订单库2,将来要扩容时,id在8000万~1.2亿的数据,划分到订单库3。然后订单库内,再用hash取模的策略,把不同订单划分到不同的表。

图片

分库分表会导致哪些问题

分库分表之后,也会存在一些问题:

  • 事务问题

  • 跨库关联

  • 排序问题

  • 分页问题

  • 分布式ID

1 事务问题

分库分表后,假设两个表在不同的数据库,那么本地事务已经无效啦,需要使用分布式事务了。

2 跨库关联

跨节点Join的问题:解决这一问题可以分两次查询实现

3 排序问题

跨节点的count,order by,group by以及聚合函数等问题:可以分别在各个节点上得到结果后在应用程序端进行合并。

4 分页问题

  • 方案1:在个节点查到对应结果后,在代码端汇聚再分页

  • 方案2:把分页交给前端,前端传来pageSize和pageNo,在各个数据库节点都执行分页,然后汇聚总数量前端。这样缺点就是会造成空查,如果分页需要排序,也不好搞。

5 分布式ID

据库被切分后,不能再依赖数据库自身的主键生成机制啦,最简单可以考虑UUID,或者使用雪花算法生成分布式ID。

分库分表中间件

目前流行的分库分表中间件比较多:

  • cobar

  • Mycat

  • Sharding-JDBC

  • Atlas

  • TDDL(淘宝)

  • vitess

图片

知识来源:马士兵教育

12张图把分库分表讲的明明白白!

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

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

相关文章

Delft3D模型教程

详情点击公众号链接:基于Delft3D模型水体流动、污染物对流扩散、质点运移、溢油漂移及地表水环境报告编制教程 Delft3D计算网格构建 Delft3D水动力数值模拟 Delft3D污染物对流扩散数值模拟 一,Delft3D软件及建模原理和步骤 1.1地表水数值模拟常用软件、…

Cmake入门(一文读懂)

目录 1、Cmake简介2、安装CMake3、单目录简单实例3.1、CMakeLists.txt3.2、构建bulid内部构建外部构建 3.3、运行C语言程序 4、多目录文件简单实例4.1、根目录CMakeLists.txt4.2、源文件目录4.3、utils.h4.4、创建build 5、链接外部库文件6、注意 1、Cmake简介 CMake是一个强大…

Centos7离线安装ALISQL5.6.32-8

由于公司设备对数据需要大量的读取和查询,开始使用的mysql8,但是未优化的mysql插入和查询及其缓慢,因此我与同事分开研究,优化方案。我负责寻找可替代高效的数据库,然后问同学,发现alisql性能不错&#xff…

微信小程序开发---事件的绑定

目录 一、事件的概念 二、小程序中常用的事件 三、事件对象的属性列表 四、bindtap的语法格式 (1)绑定tap触摸事件 (2)编写处理函数 五、在事件处理函数中为data中的数据赋值 六、事件传参 七、bindinput的语法格式 八、…

微服务框架:一招实现降本、提质、增效办公!

应用什么样的软件平台,可以帮助企业朋友提高办公协作效率?传统的办公方式已经无法满足日益增长的业务需求了,借助低代码技术平台和微服务框架,可以让繁琐的办公轻松化,更高效、快捷、便利地满足客户的办公需求。 在众多…

分布式光伏消纳的微电网群共享储能配置策略研究——Matlab代码复现

目录 摘要: 研究背景: 共享储能参与微能源网新能源消纳模式: 共享储能电站容量功率配置原则: Matlab算例运行结果: ​编辑 Matalb代码数据分享: 摘要: 共享储能是可再生能源实现经济消纳…

Undefined symbols for architecture arm64

解决问题之前,先了解清晰涉及到的知识点: iOS支持的指令集包含:armv6、armv7、armv7s、arm64,在项目TARGETS---->Build Settings--->Architecturs 可以修改对应的指令集,目前Standard Architectures(arm64, arm…

【数据分享】2006-2021年我国省份级别的道路、桥梁、管线建设相关指标(10多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况,在之前的文章中,我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国省份级别的市政设施水平相关指标、2006-2021年我国省份级别的各类建设用地面积数…

GNSS融合策略

文章目录 一、背景二、松耦合融合策略1. 信息有效性判断2. 坐标系对齐3. 观测方程a.杆臂补偿b.速度融合c.位置融合d. 航向yaw融合e.观测性分析1)状态表示在VIO坐标系下的观测性分析2)状态表示在GPS ENU坐标系下的观测性分析 一、背景 前面介绍了GNSS的定…

Dos系统的Debug工具简单使用(2023.9.7)

先看说明书: 文章目录 分项操练-A-C-D-E-F-G-H-I-L-M-N-O-P-Q-R-S-T-U-W-XA-XD-XM-XS-? 分项操练 -A 全称:assemble(汇编) 作用:给定地址范围,写入汇编命令 格式:-a 首地址 如果…

常用echart图总结

柱状图 - category-work,grid直角坐标,legend,series-bar柱状图,tooltip提示框 - makeapie echarts社区图表可视化案例

制造企业如何优化物料控制?

导 读 ( 文/ 2127 ) 物料控制是指对制造过程中所涉及的物料流动和库存进行有效管理和控制的过程。它包括物料需求计划、供应商管理、物料采购、物料接收和入库、物料库存管理以及物料发放和使用等关键环节。通过精确的物料需求计划和库存管理,物料控制可以确保物料供…

达之云BI平台助力融通集团陕西军民服务社有限公司实现数字化运营

中国融通集团陕西军民服务社是一家大型综合类零售购物中心,公司目前管理系统运行了10年左右,面临系统新零售支持发展严重滞后,行业主流应用落地困难,如线上业务、到家业务、全渠道营销、电子发票、自助收银、扫码购、无感停车、未…

【C++ Core Guidelines解析】深入理解现代C++的特性和原理

文章目录 👨‍⚖️《C Core Guidelines解析》的主要观点👨‍🏫《C Core Guidelines解析》的主要内容👨‍💻作者介绍 🌸🌸🌸🌷🌷🌷💐&a…

城市区县级数字孪生智慧水务信息化建设思考

随着水利部近几年对数字孪生水利建设的不断推进,区县级水司建设数字孪生智慧水务已经成为当前水务管理的重要发展趋势。智慧水务通过信息技术手段提高水务管理的效率和精度,实现水资源的合理利用和保护。本文将探讨区县级水司建设智慧水务的思考&#xf…

华为三层交换机与路由器对接上网

华为三层交换机与路由器对接上网

Python标识符命名规范

简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。 Python 中标识符的命名不是随意的,而是要遵守一定的命令规则,比如说:…

2023外贸SEO推广怎么做?

答案是:2023外贸SEO推广可以选择谷歌SEO谷歌Ads双向运营。 外贸SEO的核心要素 外贸SEO不仅仅是关于关键词排名,它更多的是关于品牌建设和目标受众的吸引。 要想成功,必须认识到几个关键要素。 了解目标市场 首先,要深入了解目…

数字电路-基础

数字信号的概念 数字电路:对数字信号进行传送、逻辑运算、控制、计数、寄存、显示等的电路。 分析方法:逻辑代数 数字电路的特点、发展概况 1.特点:结构简单,容易制造、便于集成化; 精度高、可靠性好; 能进行逻辑运算和逻辑判断等(也称数字逻辑电路)。 2.发展概况: Multisim…

港陆证券:突然崩了!科技股大跌,苹果蒸发超7000亿

当地时间9月6日,美股三大指数齐跌,苹果等科技股重挫。 美国8月ISM服务业指数超预期升至54.5的半年新高,连续8个月扩张,工作指数升至2021年11月来最高,新订单指数也创6个月新高,但反映通胀的付出指数创4个月…