前言
不知道大家有没有这样的经历,明明感觉自己这个技术掌握的还行,能写在简历里肯定是有点自信的,但是被面试官一问,就感觉啥也不是
当我从面试的大楼里出来的时候脑袋里还是昏昏沉沉的,你压根不知道我经历了什么,我就面试一个开发岗位,有必要问我这么多
后来咨询了一下我在阿里的师兄,他是这么说的:现在的就业竞争很激烈,在考察技术的时候不单单是停留在应用层面,底层的原理你也要有所了解,这样在遇到不可控问题的时候你才能游刃有余的解决掉。
跟他谈了蛮久,了解到我一些问题后,直接给了我一份他的学习笔记,让我回去用两个星期啃完,大家一起来看看吧
由于篇幅影响,只展示一下大概内容吧
Spring技术内幕深入解析Spring架构与设计原理
Spring核心实现
正文
作为后端开发,日常操作数据库最常用的是写操作和读操作。读操作我们下边会讲,这个分类里我们主要来看看写操作时为什么会导致 SQL 变慢。
刷脏页
脏页的定义是这样的:内存数据页和磁盘数据页不一致时,那么称这个内存数据页为脏页。
那为什么会出现脏页,刷脏页又怎么会导致 SQL 变慢呢?那就需要我们来看看写操作时的流程是什么样的。
对于一条写操作的 SQL 来说,执行的过程中涉及到写日志,内存及同步磁盘这几种情况。
这里要提到一个日志文件,那就是 redo log,位于存储引擎层,用来存储物理日志。在写操作的时候,存储引擎(这里讨论的是 Innodb)会将记录写入到 redo log 中,并更新缓存,这样更新操作就算完成了。后续操作存储引擎会在适当的时候把操作记录同步到磁盘里。
看到这里你可能会有个疑问,redo log 不是日志文件吗,日志文件就存储在磁盘上,那写的时候岂不很慢吗?
其实,写redo log 的过程是顺序写磁盘的,磁盘顺序写减少了寻道等时间,速度比随机写要快很多( 类似Kafka存储原理),