摘要:
对于数据库整体体系结构的理解,是随后逐个模块细化深入突破的前提.
如果不能建立全局的图景, 对各个模块之间的关系有深刻的理解,那么在对单个模块的分析突破中,就很容易迷失在里面.
更为重要的, 全局的理解,是建立自己的数据库整个体系知识结构的根基.
并且, 没有全局的视角, 各个组件和模块之间的关系的模糊,将无法将某个具体的模块的知识通过自身的知识结构回忆起来.
本文记录如何正确的理解总体架构设计, 需要说明本文所说的数据库特指关系型数据库, 例如mysql. 对于nosql或者newsql,例如redis, 由于使用的场景的不同,不在本文分析范围内.
不可直接去记忆数据库架构图和模块!
- 这是最容易犯的错, 也是最常犯的错!因为这么做太直接了, 不会的东西,我直接去看, 死记硬背下来就行了
- 那么说明了错误的做法,那么要如何做呢?最为根本的,是要符合大脑的思考问题的特性
- 那么大脑是如何思考问题和分析问题的呢?
- 是的,逐层推理演绎, 从一个点, 开始推进到后一个点, 然后逐步的推导下去
- 所以这是一个层次的结构, 也就是一个树形结构
- 那么对于数据库的整体架构, 最初的点是什么呢? 是要满足的需求!
- 是不是很震惊,是从需求出发!
- 就是因为太明确了,所以经常被忘掉这一点!
- 数据库的架构和设计, 是为了满足要达到的需求的!
- 那么数据库的需求是什么呢?
数据库产品的需求:
一. 使用ANSI SQL语言进行操纵
- 这一点也是非常明显的,所以非常容易被忽略
- 但是要明白, SQL是一门语言!
- 那么SQL是一门语言意味着什么呢?
- 符合巴克斯范式的写法及符合SQL标准规范,都可以被允许, 从而导致海量的场景
- 存在词法解析和语法解析模块, 来对ANSI SQL处理成数据库内部的数据结构
- SQL带来查询的复杂性
- 这点可以和redis的简单的command对比就一目了然
- 从而导致存在某些低效率的查询SQL,要被重写
- 这就意味着存在一个查询优化器来生成执行序列!
- 查询优化器和查询执行器又带来了什么呢?
- 带来了所有数据库中最为庞大的模块!
- 可以说是数据库中最为复杂的模块
- 明白了吧?从知识的组织层次看
- 为什么非要有查询优化器和查询执行器?
- 将用户的SQL直接翻译成操作序列, 直接去执行不可以吗?
- 不做查询优化直接去执行用户的操作序列当然可以!但是在查询性能上竞争不过竞争对手,最终导致商业的失败
二. 要满足事务ACID的特性
- ACID, 原子性, 一致性, 隔离性, 持久性
- 是的, 这不是数据库的特性,而是对数据库的需求!要求数据库满足这样的目标!
- 就是为了要实现ACID的目标, 才出现了一系列的模块和设计
- 为了实现原子性和一致性
- 要么都成功,要么都失败, 那么就需要回滚日志, 在出错后, 回滚到操作前的状态, 从而成为原子的
- 也就是所谓的undo log, 这个东西的出现是为了实现原子性的需求!不是因为八股文那么写就必须要死背这个东西
- 那么满嘴undo log, redo log, binlog, chek point,却闭口不谈要达到的需求目标和目的的,不是蠢,就是坏,而且八成就是坏, 故意误导人
- 为了实现隔离性
- 这就要实现不同事务之间的隔离, 这就需要一个事务管理器来控制不同事务的可见性
- 从而就意味着必须对单个事务所需要的资源. 确保只有这个事务可以看到
- 并且要保证不同事务在运行时,不会修改对方的数据, 这就需要不同程度的锁来保护临界区
- 使用了锁, 那么就必然面临锁的一些问题. 例如死锁, 如何处理又是一个新的场景
- 对应的mysql中的X锁,S锁,间隙锁等等,都是为了对应不同的场景的隔离性, 那么忽略了需求和目的, 又是开始背八股文的沙雕, 简直就是十足的蠢货。那些一个劲的八股文的面试官也是十足的莼湖藕
- 为了实现持久性
- 这就意味着数据必须保存到磁盘上
- 但是数据库对数据的操作都是内存上
- 这就导致必然需要一个磁盘间数据与内存的数据之间的管理系统,来应对数据在不同的存储层次上的处理
- 而事务的数据, 直接修改都是在内存中, 必须保证写入物理磁盘
- 这就导致事务在数据库服务突然发生异常的时候,下次数据库服务启动时,依然能恢复这个事务
- 在mysql中,这个机制就是redo log
从SQL和事务的需求角度去理解数据库架构设计:
- 所有的架构和设计都必须有其目的, 否则就是失败的设计
- 数据库的架构设计目标, 便是实现用户使用SQL操纵数据库, 以及满足事务的特性
- 从这个角度去理解数据库整体的架构设计, 而不是去死记硬背
- 目的, 目的,还是目的, 解决方案是为了目的设计的
- 数据库这行已经有了太多的混子只会满嘴八股文, 做起事情只会照本宣科死板硬套, 对上忽悠,对下拿着教条当金科玉律,这种人就是十足的坏