大家好,我是sulny_ann,这期想跟大家分享一下我之前在面试里面问过比较难的数据库相关的问题。

大家经常也在调侃后端好像就是技术数据库的增删改查,所以作为后端开发,你对应数据库这一块掌握的怎么样,是非常能看出你整个开发的技术能力水平。

接下来就分享 3 个我之前问到的关于数据库的 3 个问题。

第一个问题就是如果一个事务当中有更新操作,也有查询操作,那我是先更新好呢?还是先查询好?

很多小伙伴一听到这个问题不知道我想考啥,我印象比较深刻就是这个候选人他还是比较聪明的,他还先问我一下,你这个更新操作依不依赖这个查询的操作。我也提示了这两个是没有什么依赖关系的,所以这里我的重点是开启了一个事物,那对于事物它肯定是要消耗资源的,那消耗的资源有哪些东西?

有连接池,还有底层的锁,那大家想一下,更新它可能是会持有什么锁呢?有可能是行锁,也有可能是间隙锁,甚至可能是表锁。那既然这个事物加锁,那其他的事物只能在这些资源上去做一个等待,这就可能降低整个数据库的并发性能。

所以这个问题应该怎么去回答呢?其实在大部分的情况就应该先去查询,再去更新,但这里的查询默认是不会去加锁的。如果先更新,再去查询,如果这个查询是一个慢SQL,那这个更新操作它持有的资源是会一直阻塞在这里。

那先查询再更新,那你 select 就算是一个慢SQL,在这个查询执行过程当中其实是没有加锁的,这能够一定程度提升整个数据库的并发能力。我之前在线上确实也做过类似的优化,只要把他们执行的顺序稍微改一下,在一些并发比较高的接口确实能够提升很大的性能。

第二个问题就是我们经常在设计数据库表的时候,经常会做一些字段的冗余,你觉得这样做有什么优缺点?

这其实也是非常常见的一种反范式设计。做字段冗余大部分情况下是为了便于去查询,例如商品跟店铺之间的关系,我可能有一个关系表,但是我在业务上有很多查询,就是要基于店铺去查询他所有的商品,那难道每一次查询都要去做一个join吗?或者查两次吗?如果说我在商品这个表里面去加一个店铺的字段,做这么一个字段的冗余就能够很大程度提升整个查询的性能。

那做字段冗余有什么缺点吗?也有就是如果你要去更新这个关系,你可能要改多个地方,这个就有点类似于缓存的一致性问题,而且这种问题如果在同一个数据库可能还比较好控制,如果是在多个数据库,那你这个风险就非常大了。

所以这里你还要看你的业务场景,就是查询的占比比较高,还是写的占比比较高。如果说是写的占比比较高,那你这个带来事物还有不一致的风险可能会更大。

第三个问题确实也比较有挑战,就是我们的 MySQL 里面的 binlog redolog,哪一个是先产生的?

这个问题大家又觉得我是想问什么东西呢?要回答好这个问题,你首先要知道 binlog 跟 read log 它们分别是用来干嘛的,解决什么问题的。

简单介绍一下, MySQL 底层其实是分了好几个结构的,其中有 Server 层,还有 engine 层。

binlog它就是产生在 Server 层,是用来记录数据库DML 产生的二进制日志,主要是用来做主从主备他们之间的一些数据备份。

那 redolog 它是产生在 MySQL 的 engine 层的,主要是用来保证数据操作的原子性。那这两种日志他们其实都有自己的一个缓冲区。

但是他们持久化一般都是分两个步骤:先写在操作系统的内核区,再去做一个刷盘操作。

如果对可行性要求比较高,那我们每次产生事物的时候都是去做一个持久化,但是我们一般情况只会考虑把它刷在操作系统的内核层,因为这种情况是性能跟它的数据可靠性做一个折中,只要操作系统层面没有宕机,那这个数据一般是不会丢失的。

说到这里我们好像并没回答这个问题,就是这两个操作哪个先产生?那这里产生是站在什么角度?是站在磁盘的角度,还是说站在 MySQL 进程的角度?如果说是进程,他们两个基本上是同时产生的,但是坐在磁盘的角度,其实redolog 它可能先产生,为什么说是可能呢?因为 binlog 他一定说是事物提交之后才会去做一个持久化。

但是 Redo log 它其实有多种刷盘的机制,例如 MySQL 层面,它提供了一个同步的参数,你只要每次事务都操作,都去做一个提交,这个性能可能是比较差的。

但是它还有另外两种刷盘的机制,它默认有一个 1 秒钟去刷新整个内核缓冲区的一个进程,那这个时候你就算事务没有提交,它也会把缓冲区的这个redolog进行刷盘操作。

那在这个过程当中,可能事务还没有提交,那 redolog 已经放在磁盘上了。

当然有些小伙伴可能会觉得如果这个过程当中断电了怎么办?那会不会有 redolog,然后binlog不一致?​这就是 MySQL 它为什么要去实现一个二阶段提交这么一个过程,这里时间有限,就不去做过多展开了。

当然不同的 MySQL 它底层的版本参数也会有一些不一样,比如说它有些可能还是基于你事物提交多少个它就进行一个刷盘,或者中间你可以去设计一个缓冲区,容量达到多少它也会进行一个强制刷盘。

这个在不同的 MySQL 版本之间,它们的默认值,还有这些缓冲区的参数可能都不太一样。然后这里很多同学可能就会想,我学这些有什么用,平时在工作当中又用不上。

怎么说呢,还是有一定用途的,你会发现这些很多参数基本上都是在可用性跟性能之间去做一个选择,所以如果你在特定的业务场景下,你确实是可以在数据库层面去做这么一些调优。这也是为什么很多高级的DBA,他必须要去了解一定的业务场景。可能站在开发的角度就觉得 DBA 你只要管好运维就行了,你不用去关心我的业务。那同样呢,开发其实也可以去基于你的业务场景去反向给 DBA 提供一些建议,可以去调整哪些参数?可能在大部分小伙伴的工作环境下,其实并没有必要去调整这些东西,你的业务也可以正常的运行,所以大家就没有学习这些东西的积极性了。

​但是我认为作为后端开发,你还是要去了解底层的一些结构的,这些配置的参数名你没必要去记,但是你至少知道大概有这么一个东西,然后用的时候你可以快速的去查,然后学到这些东西,你还可以把这种比较好的思想应用在你的项目实际的工作当中,他很多思想跟设计哲学其实是可以借鉴过来的,这也是我们对于技术专家和架构师他需要的一个通用能力。

好,这一期就分享我之前在面试当中问到这几个数据库比较复杂的问题,如果大家认为写的还不错,也希望大家点赞转发,没关注的小伙伴也别忘了关注下,后面就不会错过很多技术的干货了。

架构师必会之-DBA级问题的数据库底层设计思想的更多相关文章

  1. 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结

    本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言   MySQL作为开源技术的代表作之一,是 ...

  2. Java架构师必会的技能

    Java架构师必会的技能 我把它分为了五大专题 工程化专题 工程化专题 git git安装使用 git日常使用:fetch/pull/push/revert/rebase git分支管理git flo ...

  3. 成为JAVA架构师必看书籍推荐

    原创文章 “学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书 ...

  4. Java 架构师 -- 必读书单

    “学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会. 个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远 ...

  5. IT职业技能图谱:架构师、H5、DBA、移动、大数据、运维...

    转载 作者:StuQ 文章收藏自微信:InfoQ   时隔近5个月,StuQ的小伙伴们再次出品了IT职业技能图谱更新版.这回除更新之前版本外,还添加了架构师.HTML 5.DBA等新的职业技能图谱.正 ...

  6. 【架构师之路】APP架构师必看:面对爆发流量如何进行架构调整

    一.APP架构与WEB架构的最大不同 移动APP的架构和传统PC的WEB架构有三点不同: 1.连接的稳定性.在传统的web端连接成功后就可以认为它是稳定的,但在移动端.无线端,APP连接非常敏感,可能 ...

  7. 那些Java架构师必知必会的技术

    Java基础 Java 7 和 Java 8 中的 HashMap原理解析 Java7 和 Java8 中的 ConcurrentHashMap 原理解析 Java中自定义注解 Java函数式编程和l ...

  8. Java架构师必看的10本书

    1.大型网站系统与JAVA中间件实践 本书围绕大型网站和支撑大型网站架构的Java中间件的实践展开介绍. 从分布式系统的知识切入,让读者对分布式系统有基本的了解:然后介绍大型网站随着数据量.访问量增长 ...

  9. Java架构师必看,超详细的架构师知识点分享!

    在Java程序员行业中,有不少Java开发人员的理想是成为一名优秀的Java架构师,Java架构师的主要任务不是从事具体的软件程序的编写,而是从事更高层次的开发构架工作.他必须对开发技术非常了解,并且 ...

  10. php高级研发或架构师必了解---很多问题面试中常问到!

    一.mysql相关知识    1. mysql优化方式            MYSQL 优化常用方法            mysql 性能优化方案      2.如何分库分表            ...

随机推荐

  1. NodeJs 实践之他说

    NodeJs 实践之他说 作为前端,我们知道 node 在构建方面是成功的,我们也听说过全栈,那么 node 是否能应用在企业级的后端?一起来看一下腾讯视频的 NodeJs 改造. Tip: 故事大概 ...

  2. 【汇编】老师太hun

    老师只是随手发实验项目卡,从未提过实验报告的事情 可是 他却要在 复习周 一下子 收6次 实验报告 也不发资料,不说每次的时间点,不讲实验 这人心中有 学生 吗? 上课发 上个班直播的录播 一节课就发 ...

  3. 为什么 GPU 能够极大地提高仿真速度?

    这里的提速主要是针对时域电磁算法的.因为时域算法的蛙跳推进模式仅对大量存放在固定 位置的数据进行完全相同的且是简单的操作(移位相加),这正是 GPU 这类众核 SIMD 架构所进行的运算,即 ALU ...

  4. 2023 5.14 虚拟环境安装Linux

    1.安装配置VM虚拟机 vmare workstation 虚拟机是一款桌面计算机虚拟软件 让用户能够在单一主机上同事运行多个操作系统 1.每个虚拟操作系统的硬盘与数据都是独立 2.多台虚拟机可以构建 ...

  5. 终极指南!Terraform的进阶技巧

    如果您已经对 Terraform 了如指掌,并期望自己的 IaC 技能有进一步提升的话,这篇文章很适合您!在本文中,我们将分享一些 Terraform 的高级使用技巧.从使用模块(module).工作 ...

  6. .net Assembly.Load重复加载程序集造成执行异常

    最近ET做热更重载dll的时候,返回登陆会重新检测新的dll,首次登录之前已经Assembly.Load()过一次dll,第二次返回登陆再次load dll到内存中,Invoke执行方法的时候,异常了 ...

  7. pip 20.3 新版本发布!即将抛弃 Python 2.x

    据 Python 软件基金会消息,Python Packaging Authority 和 pip 团队于北美时间11月30日宣布发布 pip 20.3版本,开发者可以通过运行 python -m p ...

  8. CKS 考试题整理 (16)-Pod安全策略

    Task 创建一个名为restrict-policy的新的PodSecurityPolicy,以防止特权Pod的创建. 创建一个名为restrict-access-role并使用新创建的PodSecu ...

  9. 使用Docker将Vite Vue项目部署到Nginx二级目录

    Vue项目配置 使用Vite创建一个Vue项目,点我查看如何创建 配置打包路径 在Nginx中如果是二级目录,例如/web时,需要设置线上的打包路径 在项目跟路径下创建两个文件:.env.produc ...

  10. 关于Java已死,看看国外开发者怎么说的

    博主在浏览 medium 社区时,发现了一篇点赞量 1.5k 的文章,名称叫<Java is Dead - 5 Misconceptions of developers that still t ...