前言
📝这是一个十分主观记录,可能是我对技术的思考或者是批判,可能是我当下的想法这个想法随时都可能发生改变。
回想第一次实习的时候,我收获到什么了?可能最有印象的是对技术的思考,这一点可能是最重要的,在以前自己独立做项目的时候,并不会去过多思考为什么要用这个技术,那时候是以技术的角度出发去做。
通过实习的技术调研评审,我开始思考业务,总结起来其实就是「技术永远是反哺业务的」,所有我认为我应该去思考如何根据业务去选择对应的技术,在体量不大的时候根本没有必要去使用市面上所谓的“高大尚”技术,做到KISS原则,并且保证在实现的时候做一些扩展性的考虑就可以了。
那为什么自己在做项目的时候,明明没有那么大的体量但是又要用那些技术呢?「养兵千日,用兵一时」在工作中可能前期用户体量并不大,但是可能随着产品迭代用户量开始增大,你得「有能力」去重构你的项目,重新选择合适当前的技术。
在阅读到唯一索引和普通的索引如何选择,发现了一个点就是在普通索引更新操作的时候,可以将待更新的数据先存入到change buffer,然后当我们需要查询的时候,才进行merge。突然发现这一个点在项目中也有使用到,例如要更新数据库的时候,可以在之前使用一个缓冲区,当缓冲区达到某个条件再去统一更新数据库
其实又有一个地方可以思考的,就是我们引入一个东西,一定要考虑如果它挂了怎么办?数据呢?例如缓冲区就是
- 当还没有进入缓冲区的时候挂了怎么办?
- 进入的时候缓冲区的时候挂了怎么办(数据进入了一半)?
- 数据在缓冲区的时候挂了怎么办?
- 传入DB的时候挂了怎么办?
或许这个就是技术的通用性?
在MySQL中,事务提交的时候,如果直接进行刷脏页操作,会涉及到随机IO,导致事务的提交过程变慢。为了优化这一流程,MySQL的InnoDB存储会将修改数据记录到Redo Log中,这是一个顺序IO,成功后立刻返回事务提交成功。(异步处理)
💃:再一次验证技术思想是相通的,在学习到这一点,很快就能联想到平时开发的时候也会是使用到这样的异步思想,为了能够快速返回该链路上的结果,使用异步化进行。当然其中要考虑十分多的case情况了。MySQL是使用了Redo Log来解决了各种case情况。
如何进行学习? 在学习InnoDB的时候,先从InnoDB想达到什么目的,它平衡了「高可用」和「高性能」。 因此有内存结构和磁盘结构 内存结构中:保证高性能有页的概念、怎么识别数据在哪个页中、设计出描述数据块和数据页缓存的Hash表、如何做到快速查询页呢?设计出页与页之间是双向链表等等 好像所有那些不明所以的知识点就给串联起来了,所以从「我要做什么」出发可能会有不一样的学习体验