分库分表常见面试问题

分库分表常见面试问题

  • 1、什么是分库分表
    • 1.1 分表和分区的区别
  • 2、怎么分库分表
    • 2.1 到底分多少库,分多少表合适
  • 3、分表字段选择
  • 4、分表算法
  • 5、全局ID
  • 6、分库分表会带来什么问题
  • 7、分库分表之后,表还不够怎么办
  • 8、为什么喜欢使用2的次幂进行分库分表
  • 9、数据倾斜会带来什么问题,如何解决
  • 10、分库分表之后怎么进行join操作

如有侵权,请联系~
如有错误,也欢迎批评指正~

1、什么是分库分表

分库指的是将数据分布在多个数据库实例中。每个数据库实例只存储部分数据,通常是通过某种分片策略(如哈希、范围等)来决定数据的分布。
分库解决的问题是: 并发量大的问题。随着并发量的增加,数据库的连接池可能就会打满,成为瓶颈。虽然数据库的连接池可以修改,但也不是可以无限的增加。可以通过增加数据库的实例以此来提供更多的数据库连接,从而提升系统的并发度。

分表是指将一个数据库中的表拆分成多个表,以减少单个表的数据量,从而提高查询性能。可以在同一个数据库中分表,也可以在多个数据库中分表。
分表解决的问题是: 单表太大影响存储和查询的效率问题。数据库是使用B+树进行存储的,一般的B+树是3-4层,如果太多就会影响查询效率,增加磁盘的IO次数,增加耗时。
分表时机: 单表记录不能超过2000万或者单表大小不能超过2G。【阿里规范:单表不能超过500万】(可以根据页大小16K,三层计算得出)。并不是说只有满足这个条件才开始分表,而是预计未来你的流量肯定会超过这个,一开始就要分表。例如用户表、日志表、订单表。

1.1 分表和分区的区别

数据过大的时候,我们不仅仅可以分表,也可以选择分区。表存储主要是依赖两个文件:.frm文件【存储表结构定义】和.ibd文件【存储数据】。
分区之后表面上还是一张表【同一个.frm文件,.ibd文件不同,存储文件如下形式:order.frm、order_p1.ibd、order_p2.ibd】,数据库自己会组织各个分区。分区不宜太多,因为数据库启动的时候会加载所有的分区文件,如果太多超过机器所能允许打开的最大文件数量,则会报错;
而分表之后就是不同的表【.frm文件和.ibd文件均不同,存储文件如下形式:order_1.frm、order_p1.ibd、order_1.frm、order_p2.ibd】,操作数据库的时候就要去指定表。

2、怎么分库分表

拆分方式主要有两种:横向拆分和纵向拆分。
横向拆分: 将所有的数据记录拆分到多张表中,使得每个表中的数据数量都有所降低。
纵向拆分: 将每行记录中的部分字段上的数据拆分到其他表中。这种每个表中的数据记录数量不会变化,只是存储降低了。一般是一条记录中的某些字段比较常用,有些字段不常用,将不常用的字段拆分出去。

2.1 到底分多少库,分多少表合适

按照单表能够存储的最大容量2000万计算:
分表数 = 预计最大的容量 / 2000万 ->2的次幂。即,最大容量/2000万得到的数向上取整得到最接近的2的次幂
分库数主要是根据并发量来计算,可以按照如下预估:
分库数 = 分表数 / 8

3、分表字段选择

分表字段的选择肯定是结合业务情况进行选择。例如订单需要分库分表,一般是按照买家id作为分表字段。因为如果使用卖家id作为分表字段,可能会存在数据倾斜,因为有些头部的卖家会有大量的订单,并且买家查询也会比较多。
如果卖家查询怎么办?

  • 基于binlog进行实时的同步一个以卖家id为维度的分表【只用来查询,不进行DML操作】。如果不想占用这么大的空间,卖家表可以只存储买家id和卖家id,通过卖家id查询到买家id,然后再进行利用买家表进行查询【如果通过卖家查询的QPS不大,并且数据量没那么大,是不是不需要分库分表】。
  • 将卖家id和买家id存储在缓存,如redis中
  • 将表同步到ES中,或者是同步到分布式数据库中,如HBASE
  • 基因算法。例如虽然按照买家id进行分库分表,可以将买家id分库分表的数据拼接到订单id上【如订单id-买家id】,这样进行订单查询的时候也可以利用后面的买家id进行分库分表,知道去哪个表中查询。

4、分表算法

  • 直接对字段进行取模。如直接对userid进行取模
  • hash取模。如果分表字段不是数字类型,需要先对字段求hash,再取模。如name
  • 使用关键字。如按照创建时间进行分库分表
  • 一致性Hash。为了解决二次扩容问题,降低数据迁移成本。

5、全局ID

对数据进行了分库分表,每张表都有自己的主键,不同表之间就会有相同的主键。如果想所有的记录都具有全局唯一性,则需要增加一个字段,全局ID。全局ID的生成方式:

  • UUID算法
  • 雪花算法、Leaf算法
  • 使用一张表专门用来生成全局ID,每个记录都去这张表中获取全局ID
  • 使用redis等存储全局ID,每个记录都去redis中获取全局ID,redis自增incr

6、分库分表会带来什么问题

  • 每次查询都需带着分表字段,否则将会对所有库和表进行扫描
  • 数据库事务失效,必须使用分布式数据库
  • 针对于部分分页查询或者是排序将会失效

7、分库分表之后,表还不够怎么办

我们在第一次分库分表的时候尽量避免这种情况的发生。如果业务突然暴增,确实出现了不够的情况,怎么办?

  • 可以将历史的数据进行归档;
  • 二次分表。二次分表肯定涉及到数据迁移,怎么可以减少二次分表带来的成本【数据迁移】:
    • 按照2的次幂进行分库分表
    • 一致性hash

8、为什么喜欢使用2的次幂进行分库分表

  • 在进行对分表字段【或者是hash之后的分表字段】取余的时候,可以将取余%操作转换为与操作【如,&(01111)】,提高计算效率
  • 二次分表的时候数据迁移少,成本低
  • 在进行分库分表的时候每个数据库分配到的表格比较均匀

9、数据倾斜会带来什么问题,如何解决

数据倾斜是指在分库分表的时候,由于分表算法或者分表字段选择不合理等原因出现了数据分配不均匀,某些节点的数据比其他节点多。这会导致:

  • 机器资源使用不均衡
  • 某个节点的性能出现瓶颈
  • 查询性能下降
  • 影响其他业务查询:这个大表中其他的少量数据查询也会变得很慢

怎么预防出现数据倾斜?

  • 选择合适的分表字段
  • 使用复合分片,结合多个分片字段进行分片
  • 虚拟分片。先使用分片算法分成多个虚拟的分片,然后虚拟的分片再进行映射到时机的物理分片上【物理分片数量远远小于虚拟的分片数量】

如果出现了数据倾斜,那怎么解决呢?

  • 二次分表。将这部分数据在进行拆分
  • 将这个数据倾斜严重的数据隔离出来单独使用一个数据库进行存储

10、分库分表之后怎么进行join操作

  • 应用层处理。所有的数据都读取到应用层,然后程序进行过滤操作
  • 数据库中间件,类似于数据库的一层代理,如MyCat数据库中间件
  • 在设计数据库的时候允许一些冗余字段,以减少join操作
  • 将数据同步到ES等搜索引擎中,ES进行聚合,进行查询

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

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

相关文章

51单片机完全学习——红外遥控

一、红外接收模块原理 红外接收头内部本身有一个反相,意思就是:平时发送方无信号时接收到的是1,发送方有发送载波时接收头引脚输出的是0,写代码的时候注意这一点。红外协议,你也可以理解成,他对0和1重新做…

HarmonyOS 5.0应用开发——Navigation实现页面路由

【高心星出品】 文章目录 Navigation实现页面路由完整的Navigation入口页面子页面 页面跳转路由拦截其他的 Navigation实现页面路由 Navigation:路由导航的根视图容器,一般作为页面(Entry)的根容器去使用,包括单页面&…

iPhone SE 4:定了

万众期待的iPhone SE 4,近日传来了确定的消息。 近日,屏幕供应链分析师Ross Young透露:iPhone SE 4的屏幕面板,预计在 11 月份开始出货,并将于 2025 年年初正式发布。 来了来了,终于来了。 和以往不同&am…

【C++打怪之路Lv12】-- 模板进阶

#1024程序员节|征文# 🌈 个人主页:白子寰 🔥 分类专栏:重生之我在学Linux,C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您…

【jvm】堆的内部结构

目录 1. 说明2. 年轻代(Young Generation)2.1 说明2.2 Eden区2.3 Survivor区 3. 老年代(Old Generation)3.1 说明3.2 对象存放3.3 垃圾回收 4. jdk7及之前5. jdk8及之后 1. 说明 1.JVM堆的内部结构主要包括年轻代(You…

SpringBoot poi-tl通过模板占位符生成word文件

简介: 开发中我们需要通过在word中使用占位符来动态渲染一些数据,本文讲解poi-tl实现动态生成word文档,包括表格循环,对象嵌套。 poi-tl官网文档 Poi-tl Documentation 1. word格式 这是我的test.word 这是导出后的out.docx文件 …

详解Pectra升级:如何影响以太坊价值及利益相关者

Pectra很可能是最后几个会直接影响用户和ETH持有者的升级之一。 原文:Galaxy Research;编译:Golem;编辑:郝方舟 出品 | Odaily星球日报(ID:o-daily) 编者按:以太坊 Pectr…

了解 WebSocket

了解 WebSocket 轮询方式、短轮询长轮询SSE WebSocket为什么说 WebSocket 是基于 Http 协议的?如何通过 Sec-WebSocket-Key 与 验证 Sec-WebSocket-Accept验证 demo SpringBoot 中使用 WebSocket引入依赖增加 WebSocketConfig修改 ServerEndpointConfig定义 ServerE…

保研考研机试攻略:python笔记(1)

🐨🐨🐨宝子们好呀 ~ 我来更新欠大家的python笔记了,从这一篇开始我们来学下python,当然,如果只是想应对机试并且应试语言以C和C为主,那么大家对python了解一点就好,重点可以看高分篇…

易基因:Nat Commun:ATAC-seq等揭示恒河猴大脑高分辨率解剖区域的转录组和开放染色质图谱

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 恒河猴是神经科学研究中常用的模型动物,其大脑结构和功能与人类大脑相似。大脑中复杂的遗传网络是灵长类动物行为、认知和情感的基础,一直是神经科学的核心。大脑…

禾川SV-X2E A伺服驱动器参数设置——脉冲型

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!人工智能学习网站 前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任…

【Android】基础回顾--四大组件

1. 四大组件是什么? 四大组件:Activity、Service、BroadcastReceiver、ContentProvider。 2. 四大组件的生命周期和简单用法 Activity: 特殊情况下的生命周期: 典型的生命周期好像没什么可说的,主要说一下特殊情况…

基于Datawhale开源量化投资学习指南(11):LightGBM在量化选股中的优化与实战

1. 概述 在前几篇文章中,我们初步探讨了如何通过LightGBM模型进行量化选股,并进行了一些简单的特征工程和模型训练。在这一篇文章中,我们将进一步深入,通过优化超参数和实现交叉验证来提高模型的效果,并最终通过回测分…

C++ | Leetcode C++题解之第516题最长回文子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestPalindromeSubseq(string s) {int n s.length();vector<vector<int>> dp(n, vector<int>(n));for (int i n - 1; i > 0; i--) {dp[i][i] 1;char c1 s[i];for (int j i 1; j…

2-135 基于matlab的有限差分法计算电位分布

基于matlab的有限差分法计算电位分布&#xff0c;设置目标尺寸的矩形区域&#xff0c;设置矩形区域内的网格数量&#xff0c;根据网格位置在区域内设置电位&#xff0c;实现电位分布计算。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-135 基于matlab…

微信小程序的日期区间选择组件的封装和使用

组件化开发是一种将大型软件系统分解为更小、更易于管理和复用的独立模块或组件的方法。这种方法在现代软件开发中越来越受到重视&#xff0c;尤其是在前端开发领域。微信小程序的日期区间选择组件的使用 wxml 代码 <view><view bind:tap"chooseData">…

【Redis】内存淘汰策略

文章目录 什么是内存淘汰策略设置Redis最大内存执行内存淘汰策略的流程Redis的八大内存淘汰策略深入源码进行理解内存淘汰策略流程 什么是内存淘汰策略 Redis内存淘汰策略是指当Redis的内存使用达到其配置的最大内存限制&#xff08;maxmemory&#xff09;时&#xff0c;Redis…

论文笔记(五十)Segmentation-driven 6D Object Pose Estimation

Segmentation-driven 6D Object Pose Estimation 文章概括摘要1. 引言2. 相关工作3. 方法3.1 网络架构3.2 分割流3.3 回归流3.4 推理策略 4. 实验4.1 评估 Occluded-LINEMOD4.1.1 与最先进技术的比较4.1.2 不同融合策略的比较4.1.3 与人体姿态方法的比较 4.2 在YCB-Video上的评…

uniapp使用easyinput文本框显示输入的字数和限制的字数

uniapp使用easyinput文本框显示输入的字数和限制的字数 先上效果图&#xff1a; 整体代码如下&#xff1a; <template><view class"nameInfoContent"><uni-easyinput class"uni-mt-5" suffixIcon"checkmarkempty" v-model&quo…

【MyBatis源码】SqlSessionFactoryBuilder源码分析

文章目录 概述类结构从 InputStream 创建 SqlSessionFactoryXMLConfigBuilder构建ConfigurationXMLConfigBuilder初始化方法parse()方法parseConfiguration属性&#xff08;properties&#xff09; 概述 SqlSessionFactory 是 MyBatis 的核心接口之一&#xff0c;提供创建 Sql…