面试突击MySQL:高并发情况下,数据库该如何设计?

面试突击MySQL

题目:高并发情况下,数据库该如何设计?

Java高级面试题:为什么要分库分表( 设计高并发系统的时候 , 数据库层面该如何设计 ) ? 用过哪些分库分表中间件 ? 不同的分库分表中间件都有什么优点和缺点? 你们具体是如何对数据库 如何进行垂直拆分或水平拆分的?

题目来源:Java高级架构面试知识点整理--MySQL分库分表问题(附解析,如下图)

image.png
image.png

Java高级架构面试知识点整理:包含消息队列、Redis缓存、MySQL分库分表、读写分离、设计高并发系统、分布式系统、高可用架构、SpringCloud微服务架构 等8大类近200页的内容,从面试官心理分享 到 面试题剖析,一步一步扣题深入,通俗易懂,是不可多得的干货!

面试官心理分析

其实这块肯定是扯到高并发了,因为分库分表一定是为了支撑高并发、数据量大两个问题的。而且现在说实话,尤其是互联网类的公司面试,基本上都会来这么一下,分库分表如此普遍的技术问题,不问实在是不行,而如果你不知道那也实在是说不过去!

image
image

面试题剖析

为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?)

说白了,分库分表是两回事儿,大家可别搞混了,可能是光分库不分表,也可能是光分表不分库,都有可能。我先给大家抛出来一个场景:

假如我们现在是一个小创业公司(或者是一个BAT公司刚兴起的一个新部门),现在注册用户就20万,每天活跃用户就1万,每天单表数据量就1000,然后高峰期每秒钟并发请求最多就10。天,就这种系统,随便找一个有几年工作经验的,然后带几个刚培训出来的,随便干什么都可以。

结果没想到我们运气居然这么好,碰上个CEO带着我们走上了康庄大道,业务发展迅猛,过了几个月,注册用户数达到了2000万!每天活跃用户数100万!每天单表数据量10万条!高峰期每秒最大请求达到1000!同时公司还顺带着融资了两轮,进账了几个亿人民币啊!公司估值达到了惊人的几亿美金!这是小独角兽的节奏!

好吧,没事,现在大家感觉压力已经有点大了,为啥呢?因为每天多10万条数据,一个月就多300万条数据,现在咱们单表已经几百万数据了,马上就破千万了。但是勉强还能撑着。高峰期请求现在是1000,咱们线上部署了几台机器,负载均衡搞了一下,数据库撑1000QPS也还凑合。但是大家现在开始感觉有点担心了,接下来咋整呢..... .

在接下来几个月,我的天,CEO 太牛逼了,公司用户数已经达到1亿,公司继续融资几十亿人民币啊!公司估值达到了惊人的几十亿美金,成为了国内今年最牛逼的明星创业公司!天,我们太幸运了。

但是我们同时也是不幸的,因为此时每天活跃用户数上千万,每天单表新增数据多达 50万,目前一个表总数据量都已经达到了两三千万了!扛不住啊!数据库磁盘容量不断消耗掉!高峰期并发达到惊人的

5000~8000!别开玩笑了,哥。我跟你保证,你的系统支撑不到现在,已经挂掉了!

好吧,所以你看到这里差不多就理解分库分表是怎么回事儿了,实际上这是跟着你的公司业务发展走的,你公司业务发展越好,用户就越多,数据量越大,请求量越大,那你单个数据库一定扛不住。

image.png
image.png

分表

比如你单表都几千万数据了,你确定你能扛住么?绝对不行,单表数据量太大,会极大影响你的 sql 执行的性能,到了后面你的 sql可能就跑得很慢了。一般来说,就以我的经验来看,单表到几百万的时候,性能就会相对差一些了,你就得分表了。

分表是啥意思?就是把一个表的数据放到多个表中,然后查询的时候再查一个表。比如按照用户id来分表,将一个用户的数据就放在一个表中。然后操作的时候你对一个用户就操作那个表就好了。这样可以控制每个表的数据量在可控的范围内,比如每个表就固定在 200万以内。

分库

分库是啥意思?就是你一个库一般我们经验而言,最多支撑到并发2000,一定要扩容了,而且一个健康的单库并发值你最好保持在每秒1000 左右,不要太大。那么你可以将一个库的数据拆分到多个库中,访问的时候就访问一个库好了。

这就是所谓的分库分表,为啥要分库分表?你明白了吧。

image.png
image.png

你们具体是如何对数据库如何进行垂直拆分或水平拆分的?

水平拆分的意思,就是把一个表的数据给弄到多个库的多个表里去,但是每个库的表结构都一样,只不过每个库表放的数据是不同的,所有库表的数据加起来就是全部数据。水平拆分的意义,就是将数据均匀放在更多的库里,然后用多个库来扛更高的并发,还有就是用多个库的存储容量来进行扩容。

image.png
image.png

垂直拆分的意思,就是把一个有很多字段的表给拆分成多个表,或者是多个库上去。每个库表的结构都不一样,每个库表都包含部分字段。一般来说,会将较少的访问频率很高的字段放到一个表里去,然后将较多的访问频率很低的字段放到另外一个表里去。因为数据库是有缓存的,你访问频率高的行字段越少,就可以在缓存里缓存更多的行,性能就越好。这个一般在表层面上做得较多一些。

image.png
image.png

还有表层面的拆分,就是分表,将一个表变成N个表,就是让每个表的数据量控制在一定范围内,保证SQL 的性能。否则单表数据量越大,SQL性能就越差。一般是200万行左右,不要太多,但是也得看具体你怎么操作,也可能是500万,或者是100万。你的SQL越复杂,就最好让单表行数越少。

涉及高并发系统,我该怎么办?

如果不想只是单纯地做个底层CRUD的搬砖程序员,那么对于高并发系统设计这一类的问题,你必须得掌握!不用慌,小编整理了46问,贯穿整个高并发系统设计的问题,涉及:基础、数据库、缓存、消息队列、分布式、维护、实战操练等7个部分的内容(并将每一问的答案解析整理完整)。

image.png
image.png
  1. 为什么要学习高并发系统设计?
  2. 高并发系统:它的通用设计方法是什么
  3. 架构分层:我们为什么一定要这么做
  4. 系统设计目标(一):如何提升系统性能
  5. 系统设计目标(二):系统怎样做到高可用
  6. 系统设计目标(三):如何让系统易于扩展
  7. 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?
  8. 池化技术:如何减少频繁创建数据库连接的性能损耗?
  9. 数据库优化方案(一):查询请求增加时,如何做主从分离
  10. 数据库优化方案(二):写入数据量增加时,如何实现分库分表
  11. 发号器:如何保证分库分表后ID的全局唯─性?
  12. NoSQL:在高并发场景下,数据库和 NoSQL 如何做到互补?
  13. 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?
  14. 缓存的使用姿势(一):如何选择缓存的读写策略?
  15. 缓存的使用姿势(二):缓存如何做到高可用?
  16. 缓存的使用姿势(三):缓存穿透了怎么办?
  17. CDN:静态资源如何加速?
  18. 数据的迁移应该如何做?
  19. 消息队列:秒杀时如何处理每秒上万次的下单请求?
  20. 消息投递:如何保证消息仅仅被消费一次?
  21. 消息队列:如何降低消息队列系统中消息的延迟?
  22. 面试现场第二期:当问到项目经验时,面试官究竟想要了解什么
  23. 从“心”出发,我还有无数个可能
  24. 高并发系统设计期中测试题目解析
  25. 系统架构:每秒1万次请求的系统要做服务化拆分吗?
  26. 微服务架构:微服务化后系统架构要如何改造?
  27. RPC框架:10万 Q P S 下如何实现毫秒级的服务调用?
  28. 注册中心:分布式系统如何寻址?
  29. 分布式Trace :横跨几十个分布式组件的慢请求要如何排查?
  30. 负载均衡:怎样提升系统的横向扩展能力?
  31. A P I 网关:系统的门面要如何做呢?
  32. 多机房部署:跨地域的分布式系统如何做?
  33. Service Mesh:如何屏蔽服务化系统的服务治理细节?
  34. 给系统加上眼睛:服务端监控要怎么做?
  35. 应用性能管理:用户的使用体验应该如何监控?
  36. 压力测试:怎样设计全链路压力测试平台?
  37. 配置管理:成千上万的配置项要如何管理?
  38. 降级熔断:如何屏蔽非核心系统故障的影响?
  39. 流量控制:高并发系统中我们如何操纵流量?
  40. 面试现场第三期:你要如何准备—场技术面试呢?
  41. 计数系统设计(一):面对海量数据的计数器要如何做
  42. 计数系统设计(二):50万 Q PS下如何设计未读数系统
  43. 信息流设计(一):通用信息流系统的推理模式要如何做
  44. 信息流设计(二):通用信息流系统的拉模式要如何做
  45. 高并发下如何发现和排查问题?
  46. 我们如何准备抵抗流量峰值?

答案解析原件(如下图,内容过多近400页的高并发系统设计文档,无法一一将答案上传☛笔记全集(点击获取)

image.png
image.png

此外,怎么肝下MySQL?

想肝MySQL说难也还行吧,不说别的,我准备了167道超高频的MySQL面试问题(附解析,包含从基础-索引-锁-日志-调优等内容),想做Java高级程序员乃至Java架构师,想拿阿里P7-P8的offer,先将下面这些内容装进脑子里吧!

image.png
image.png

答案解析原件(如下图,内容过多64页的167道超高频的MySQL面试文档,无法一一将答案上传,但已整理如下的文档)

image.png
image.png

为了迈向高级程序员,那么这份 MySQL高级知识笔记手写文档(12章节内容)同样不可错过!!

  1. MySql重要性质
  2. MySQL安装
  3. Mysql权限
  4. MySql数据类型
  5. Mysql架构
  6. 存储引擎
  7. 事务
  8. 业务设计
  9. 慢查询
  10. 索引与执行计划
  11. SQL优化
image.png
image.png
image.png
image.png
image.png
image.png

面试突击MySQL,哪怕涉及高并发系统设计的内容,千万不要慌张!沉着!冷静!

以上所涉及的:Java高级架构面试解析、高并发系统设计46问、167MySQL高频问题解析、MySQL高级知识笔记文档 皆可作为福利分享给爱学习的你!

还请注意:认可的话多多支持一波!码字不易!万分感谢!

好好学习,天天向上!也祝浏览到此处的你前程似锦,Offer不断!!

Java八股文 文章被收录于专栏

长期分享Java面试、面经、学习、架构笔记

全部评论
面试突击MySQL:高并发情况下,数据库该如何设计?
点赞 回复 分享
发布于 2022-05-19 21:43

相关推荐

10-11 17:30
湖南大学 C++
我已成为0offer的糕手:羡慕
点赞 评论 收藏
分享
Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
评论
1
2
分享
牛客网
牛客企业服务