招行面试:高并发写,为什么不推荐关系数据?

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 资深架构师尼恩针对高并发场景下为何不推荐使用关系数据库进行数据写入进行了深入剖析。文章详细解释了关系数据库(如MySQL)在高并发写入时的性能瓶颈,包括存储机制和事务特性带来的开销,并对比了NoSQL数据库的优势。通过具体案例和理论分析,尼恩为读者提供了系统化的解答,帮助面试者更好地应对类似问题,提升技术实力。此外,尼恩还分享了多个高并发系统的解决方案及优化技巧,助力开发者在面试中脱颖而出。文章链接:[原文链接](https://mp.weixin.qq.com/s/PKsa-7eZqXDg3tpgJKCAAw)更多技术资料和面试宝典可关注【技术自由圈】获取。

本文原文链接

尼恩说在前面

在45岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团、蚂蚁、得物的面试资格,遇到很多很重要的相关面试题:

问题11:为什么高并发下数据写入不推荐关系数据?

最近有小伙伴面试招行,都问到了相关的面试题。 小伙伴没有系统的去梳理和总结,所以支支吾吾的说了几句,面试官不满意,面试挂了。

所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。

当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典PDF》V175版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】获取

招商银行的高阶Java后端面试真题

被狠狠拷打了,问的人都懵了。 项目场景题太难了,不好好准备,真的答不出!

image.png

尼恩将给出全部答案:

1.如何让系统抗住双十一的预约抢购活动?

45岁资深老架构师尼恩的参考答案,点此查看

2.如何从零搭建10万级QPS大流量、高并发优惠券系统?

45岁资深老架构师尼恩的参考答案,点此查看

3.百万级别数据的 Excel 如何快速导入到数据

45岁资深老架构师尼恩的参考答案,点此查看

4.如何设计一个支持万亿GB网盘实现秒传与限速的系统?

45岁资深老架构师尼恩的参考答案,点此查看

5.如何根据应用场景选择合适的消息中间件?

即将发布。

6.如何提升 RocketMQ 顺序消费性能?

即将发布。

7.使用分布式调度框架该考虑哪些问题?

即将发布。

9.如何让系统抗住双十一的预约抢购活动?

45岁资深老架构师尼恩的参考答案,点此查看

10.问 : 如何解决高并发下的库存抢购超卖少买?

即将发布。

11.为什么高并发下数据写入不推荐关系数据?

本文。

12.如果让你设计一个分布式链路跟踪系统?

即将发布。这个之前尼恩给一个 小伙伴改造过一个 100wtps 链路跟踪平台简历, 非常NB, 牛到暴表。

1 招行面试:高并发写,为什么不推荐关系数据?

资深老架构师尼恩告诉大家,这是一道考研 IO底层原理、事务底层原理、 IO架构设计技巧、事务架构设计技巧的核心面试题。

非常重要。

需要从以下两个方面作答:

  • 存储机制的性能开销
  • 事务特性机制的性能开销
  • nosql 和 sql 的性能对比

1.1 参考答案视频如下

https://mp.weixin.qq.com/s/PKsa-7eZqXDg3tpgJKCAAw

2 存储机制的性能开销

2.1 关系数据库的存储机制和 随机读写

MySQL 采用的是 B + 树的索引结构,一个表是一颗大的 主键有序的 B+树。 对记录的插入和删除、查找,都是随机读写。

一个高度 为3的B+树, 可以存放多少行数据呢? 这个问题的简单回答是:约 2 千万

image.png

以上内容的详细介绍,请参见尼恩的文章: 滴滴面试:单表能存200亿数据吗?单表只存2000W是真的吗,为什么?

一个高度 为4的B+树, 一共可以存放 1170 * 1170 * 1170 * 16 = 25,625,808,000 (约200亿) 行记录。

回到问题,InnoDB 一棵 B+ 树可以存放多少行数据? 这个问题的简单回答是:200亿

image.png

以上内容的详细介绍,请参见尼恩的文章: 滴滴面试:单表能存200亿数据吗?单表只存2000W是真的吗,为什么?

数据量的增长会使得索引树变得很深,从而增加了查询场景下的磁盘 I/O 操作次数。这不仅延长了查询的响应时间,还限制了数据库在并发下的处理能力。

mysql B+Tree是一个大树,它是一个聚合的完整整体,任何数据的增删改都是在这个整体内进行操作,这就导致了大量的随机读写IO。

2.2 非关系数据库的存储机制和 顺序读写

非关系数据库的 如 hbase、MongoDB、 rockdb等,都是使用LSM Tree,

LSM树它实际上不是一棵树,而是2个或者多个树或类似树的结构(注意这点)的集合。

image.png

在LSM树中,最低一级也是最小的C0树位于内存里,而更高级的C1、C2...树都位于磁盘里。数据会先写入内存中的C0树,当它的大小达到一定阈值之后,C0树中的全部或部分数据就会刷入磁盘中的C1树,如下图所示。

image.png

2.3 LSM Tree的 顺序写 的流程:

LSM 是由一棵棵小树组成,最小的树在内存, 当我们新数据写入时, 会在内存中暂存,这样能够获得非常大的写并发处理能力。

而当内存中数据积累到一定程度后,会将内存中数据和索引做 顺序写,落地形成一个数据块。

这个数据块内保存着一棵小树和具体的数据,新生成的数据块会保存在Level 0 层(最大有几层可配置),Level 0 层会有多个类似的数据块文件。

每一层的数据块和数据量超过一定程度时,合并不同Level的数据,将多个数据块内的数据和索引合并在一起,并推送到Level的下一层。

通过这个方式,每一层的数据块个数和数据量就能保持一定的数量,合并后的数据会更紧密、更容易被找到。

这样的设计,可以让一个Key存在于多个Level或者数据块中,但是最新的常用的数据肯定是在Level最顶部或内存(0~4层,0为顶部)中最新的数据块内。

2.4 LSM Tree的 查询 的流程:

而当我们查询一个key的时候,会先查内存Level 0 层的树。

如果没找到,会从Level 0层到下层,每层按生成最新到最老的顺序去查询每层的数据块。

同时为了减少IO次数,每个数据块都会有一个BloomFIlter辅助索引,来辅助确认这个数据块中是否 可能有 对应的Key;如果当前数据块没有,那么可以快速去找下一个数据块,直到找到为止。

上面LSM的概念很复杂,具体参见尼恩的电子书 《LSM 学习圣经》,可以找尼恩获取。

2.5 顺序和随机读写的性能比较

械硬盘的顺序和随机读写的性能比较

机械硬盘在顺序读写场景下有相当出色的性能表现,但一遇到随机读写性能则直线下降。

顺序读是随机读性能的400倍以上。顺序读能达到84MB/S。

顺序写是随机读性能的100倍以上。顺序写性能能达到79M/S。

原因:是因为机械硬盘采用传统的磁头探针结构,随机读写时需要频繁寻道,也就需要磁头和探针频繁的转动,而机械结构的磁头和探针的位置调整是十分费时的,这就严重影响到硬盘的寻址速度,进而影响到随机写入速度。

SSD固态硬盘 的顺序和随机读写的性能比较

顺序读:220.7MB/s。随机读:24.654MB/s。

顺序写:77.2MB/s。随机写:68.910MB/s。

总结:对于固态硬盘,顺序读的速度仍然能达到随机读的10倍左右。但是随机写还是顺序写,差别不大。

上面对比的过程很重要,具体参见尼恩的电子书 《LSM 学习圣经》,可以找尼恩获取。

3 事务特性机制的性能开销

3.1 关系数据库 内置ACID 事务的低性能

关系数据库强调 ACID(原子性、一致性、隔离性、持久性)特性,特别是在处理事务的时候。在高并发场景下维持事务的 ACID 特性需要大量的资源开销,尤其是事务的持久化阶段,涉及到日志的同步写入,这都会降低写入的效率。

为了保证数据一致性,关系数据库通常会采用锁的机制来管理并发访问,包括行锁、表锁等等。

在高并发写入场景下,锁机制可能会引起写操作的排队等待,导致写入速度大幅下降,甚至可能会出现死锁的问题,影响系统的整体吞吐量。

  • mysql 事务

阿里面试:事务ACID,底层是如何实现的?

阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?

京东面试:RR隔离mysql如何实现?什么情况RR不能解决幻读?

3.2 nosql 如何实现外置事务/ 外挂的事务

3.2.1 使用分布式事务框架 实现 低并发事务

Seata 是一款开源的分布式事务解决方案,支持多种 NoSQL 数据库。

以使用 Seata 与 Cassandra 数据库为例,首先需要在项目中引入 Seata 的相关依赖,然后配置 Seata 的事务协调器(TC)、事务管理器(TM)和资源管理器(RM)。

在业务代码中,通过 TM 开启事务,执行对 nosql 的多个操作,RM 会将这些操作注册到事务中,最后由 TC 来协调事务的提交或回滚。

尼恩团队的实操(即将发布的 高并发 营销中台实操)体系中, 已经完成了 jemter 对 Seata 进行了事务的压测, 吞吐量不过 100tps,还做不到。

3.2.2 基于消息队列实现 高并发事务

以 MongoDB 和 RocketMQ为例,当需要执行一个涉及 MongoDB 的外置事务时,首先将事务操作封装成消息发送到 RocketMQ 的消息队列中。

消费者从队列中获取消息后,开始执行对 MongoDB 的操作。

  • 如果操作成功,将消息标记为已处理;

  • 如果操作失败,RocketMQ 会根据配置进行重新投递, 最终还没有成功,将消息放入死信队列。实现最终一致性。

4 nosql 和 sql 的性能对比

这个在前面的小视频里边说一下一些通用的 常识,

具体请参见 本文前面的 答案小视频。

尼恩架构团队的塔尖 sql 面试题

  • sql查询语句的执行流程:

网易面试:说说MySQL一条SQL语句的执行过程?

美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?

  • 索引

阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?

滴滴面试:单表可以存200亿数据吗?单表真的只能存2000W,为什么?

  • 索引下推 ?

贝壳面试:什么是回表?什么是 索引下推 ?

  • 索引失效

美团面试:mysql 索引失效?怎么解决?(重点知识,建议收藏,读10遍+)

  • MVCC

MVCC学习圣经:一文穿透MySQL MVCC,吊打面试官

  • binlog、redolog、undo log

美团面试:binlog、redolog、undo log底层原理是啥?分别实现ACID哪个特性?(尼恩图解,史上最全)

  • mysql 事务

阿里面试:事务ACID,底层是如何实现的?

阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?

京东面试:RR隔离mysql如何实现?什么情况RR不能解决幻读?

  • 分布式事务

分布式事务圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )

阿里面试:秒杀的分布式事务, 是如何设计的?

  • mysql 调优

如何做mysql调优?绝命7招,让慢SQL调优100倍

美团面试:Mysql如何选择最优 执行计划,为什么?

说在最后:有问题找老架构取经‍

只要按照上面的 尼恩团队梳理的 方案去作答, 你的答案不是 100分,而是 120分。 面试官一定是 心满意足, 五体投地。

按照尼恩的梳理,进行 深度回答,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。

在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,里边有大量的大厂真题、面试难题、架构难题。

很多小伙伴刷完后, 吊打面试官, 大厂横着走。

在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

另外,如果没有面试机会, 可以找尼恩来改简历、做帮扶。前段时间,刚指导一个小伙 暴涨200%(涨2倍),29岁/7年/双非一本 , 从13K一次涨到 37K ,逆天改命

狠狠卷,实现 “offer自由” 很容易的, 前段时间一个武汉的跟着尼恩卷了2年的小伙伴, 在极度严寒/痛苦被裁的环境下, offer拿到手软, 实现真正的 “offer自由” 。

尼恩技术圣经系列PDF

……完整版尼恩技术圣经PDF集群,请找尼恩领取

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
9天前
|
存储 API 文件存储
招行面试:万亿GB网盘, 从0到1设计,如何实现?
本文由40岁老架构师尼恩撰写,针对一线互联网企业如得物、阿里、滴滴等的面试场景,特别是招商银行Java后端面试中的绝命12题,进行了深度解析。尼恩通过系统化、体系化的梳理,帮助读者提升技术肌肉,让面试官爱到“不能自已”。文章详细分析了如何设计一个支持万亿GB网盘实现秒传与限速的系统,涵盖了高并发处理、秒传实现、限速设计等核心技术挑战,并提供了完整的架构设计和代码示例。此外,还介绍了《尼恩Java面试宝典PDF》V171版本,帮助读者更好地准备面试。关注公众号【技术自由圈】,回复“领电子书”,获取更多资源。
|
6天前
|
消息中间件 存储 缓存
招行面试:如何让系统抗住双十一 预约抢购活动?10Wqps级抢购, 做过吗?
本文由40岁老架构师尼恩撰写,针对一线互联网企业如得物、阿里、滴滴等的面试题进行深度解析。文章聚焦于如何设计系统以应对大促活动中的预约抢购场景,涵盖从预告到支付的完整流程。尼恩通过系统化、体系化的梳理,帮助读者提升技术实力,轻松应对高并发挑战,并提供了详细的架构设计和解决方案。文中还分享了《尼恩Java面试宝典》等资源,助力求职者在面试中脱颖而出,实现“offer直提”。更多内容及PDF资料,请关注公众号【技术自由圈】获取。
|
11天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
3月前
|
存储 缓存 关系型数据库
滴滴面试:单表可以存200亿数据吗?单表真的只能存2000W,为什么?
40岁老架构师尼恩在其读者交流群中分享了一系列关于InnoDB B+树索引的面试题及解答。这些问题包括B+树的高度、存储容量、千万级大表的优化、单表数据量限制等。尼恩详细解释了InnoDB的存储结构、B+树的磁盘文件格式、索引数据结构、磁盘I/O次数和耗时,以及Buffer Pool缓存机制对性能的影响。他还提供了实际操作步骤,帮助读者通过元数据找到B+树的高度。尼恩强调,通过系统化的学习和准备,可以大幅提升面试表现,实现“offer直提”。相关资料和PDF可在其公众号【技术自由圈】获取。
|
3月前
|
缓存 负载均衡 API
抖音抖店API请求获取宝贝详情数据、原价、销量、主图等参数可支持高并发调用接入演示
这是一个使用Python编写的示例代码,用于从抖音抖店API获取商品详情,包括原价、销量和主图等信息。示例展示了如何构建请求、处理响应及提取所需数据。针对高并发场景,建议采用缓存、限流、负载均衡、异步处理及代码优化等策略,以提升性能和稳定性。
|
3月前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
385 1
|
3月前
|
缓存 算法 架构师
京东面试:如何设计600Wqps高并发ID?如何解决时钟回拨问题?
资深架构师尼恩在其读者交流群中分享了关于分布式ID系统的设计与实现,特别是针对高并发场景下的解决方案。他强调了分布式ID系统在高并发核心组件中的重要性,并详细介绍了百度的UidGenerator,这是一个基于Snowflake算法改进的Java实现,旨在解决分布式系统中的唯一ID生成问题。UidGenerator通过自定义workerId位数和初始化策略,支持虚拟化环境下的实例自动重启和漂移,其单机QPS可达600万。此外尼恩的技术分享不仅有助于提升面试表现,还能帮助开发者在实际项目中应对高并发挑战。
京东面试:如何设计600Wqps高并发ID?如何解决时钟回拨问题?
|
3月前
|
存储 关系型数据库 MySQL
面试官:MySQL一次到底插入多少条数据合适啊?
本文探讨了数据库插入操作的基础知识、批量插入的优势与挑战,以及如何确定合适的插入数据量。通过面试对话的形式,详细解析了单条插入与批量插入的区别,磁盘I/O、内存使用、事务大小和锁策略等关键因素。最后,结合MyBatis框架,提供了实际应用中的批量插入策略和优化建议。希望读者不仅能掌握技术细节,还能理解背后的原理,从而更好地优化数据库性能。
|
3月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
111 0
|
5月前
|
监控 算法 Java
企业应用面临高并发等挑战,优化Java后台系统性能至关重要
随着互联网技术的发展,企业应用面临高并发等挑战,优化Java后台系统性能至关重要。本文提供三大技巧:1)优化JVM,如选用合适版本(如OpenJDK 11)、调整参数(如使用G1垃圾收集器)及监控性能;2)优化代码与算法,减少对象创建、合理使用集合及采用高效算法(如快速排序);3)数据库优化,包括索引、查询及分页策略改进,全面提升系统效能。
59 0

热门文章

最新文章