Skip to content

Latest commit

 

History

History
45 lines (23 loc) · 6.01 KB

4.miniob-overview.md

File metadata and controls

45 lines (23 loc) · 6.01 KB

1.3 MiniOB 概述

MiniOB 背景

本节主要介绍 MiniOB,希望能通过 MiniOB 帮助大家从底层来深入了解数据库的实现原理。

首先介绍为什么制造 MiniOB。我们软件行业有一句话,软件行业有三驾马车,操作系统、中间件,还有数据库系统。可见,数据库系统是非常基础的一个组件。

数据库系统学习难度非常大,有工作经验的同学会经常使用和学习 MySQL 数据库,但依然不能精通数据库系统,如果要再实现一个数据库系统,那是更是难上加难。

一方面是因为数据库系统涉及的知识面非常广。想要实现一个数据库系统,必须对操作系统、内存、IO 以及网络等知识都非常熟悉,甚至要达到精通的程度,才能构建一个可用性较高、性能较好的数据库系统。而现在数据库除了单机版的内容,又涉及到了很多分布式方向的知识,如多节点主备复制,多机房等,这些分布式容灾的相关知识,涉及知识面会更广。通过这些信息可知,数据库上手难度非常大,也很难入门去做一个数据库。

另一方面是因为国内数据库系统发展非常晚,国外数据库大概在六十年代就开始起步。国内却是近几年才开始高速发展,拥有完整自主产权的国产数据库更是屈指可数。其次国内培养数据库人才的高校也很少,只有部分高校有专门针对数据库实现方向的课程,而且一般在研究生阶段才会开设,本科阶段只是学习一些基本的原理和使用。近几年,国内的数据库厂商都在大力投入数据库领域,人才却非常匮乏。

基于上述背景,我们制造出了 MiniOB,希望通过 MiniOB 能够吸引更多的同学去从事数据库系统的研发,更希望通过 MiniOB 的系列课程,帮助有兴趣、有能力的同学学习到更多数据库的底层原理知识。

MiniOB 框架

MiniOB 是一个有基础功能的小型数据库,功能模块的设计比较简单,旨在为了帮助大家快速上手学习。另外它的起步时间比较晚,有些模块还不是很完善,欢迎有兴趣的同学一起参与共建。

概述

如图所示左边是客户端,右边是服务端。客户端发起命令,通过网络通讯和服务端的网络模块去通讯收发命令。服务端的网络模块收到 SQL 请求后,交给词法/语法解析模块(Parser 模块),经过词法解析和语法解析模块将 SQL 请求字符串转换成带有语法结构信息的内存数据结构(语法树),再转发给下一个 Plan Cache,Plan Cache 目前不做特殊处理,直接再转发给 Resolver 模块。

Resolver 模块会将判断模块解析出来的语法树,进一步细化后转换成真实的对象。比如查询一张表,会把表名转换成具体的表对象;如果是查询某个字段,会转换成对应的字段名;如果是 select *,会把 * 转换成对应表的各个字段。除此之外还会做一些预检,比如查询一张不存在的表,就会提前返回错误。

经过 Resolver 阶段,会把处理的结果给到 Transformer 和下一个优化阶段。这两个阶段在部分数据库中,就是优化模块,如 MySQL。虽然图中是两个模块,但不一定按照 Transformer 和 Optimizer 的流程顺序来执行,可能会多次的循环,在保证低成本下选择较优的查询方案。

Transformer 可以理解为根据一些规则去做转换,让后面的优化器能更好地优化。比如在查询表时,查询条件为 where 1=1,永远是真,那就会直接把这个条件删除。

经过这个规则转换后,交给优化模块。优化模块会根据一些条件找到更好的查询路径。比如查询数据,需要先判断直接使用索引查询,速度更快,还是通过全表遍历查询速度更快。因为有时部分因素或条件会导致索引查询更慢,所以优化模块会做一些判断,选择较好的查询计划,再转发给下一个执行模块。

执行模块(Executor)会按照查询计划去执行,访问索引、Buffer Pool、记录管理、以及底层的模块。然后把查询的结果返回给网络模块。网络模块再通过 Socket 返回给客户端。

以上是 MiniOB 简单的框架介绍。可以看出 MiniOB 结构清晰、简单很适合用来入门数据库。

MiniOB 比赛

2021 年,OceanBase 开源团队发起了首届 OceanBase 数据库大赛。初赛使用了 MiniOB 系统,赛题是联合华中科技大学的老师一起设计了一套从浅入深的题目。从简单到复杂,层层递进学习 MiniOB,边做边学习数据库理论知识,非常提升编程能力。我们也收到很多同学的反馈说代码能力、数据库知识都得到非常充分的提升。

建议同学们在做 MiniOB 题目的时候,最开始往深处做的时候,不要去一股脑的往上堆代码,要仔细的去思考,应该怎么做,及时去重构。在实际工作中也会经常遇到这样的问题,在原有的功能基础上,再加新功能时,可能之前设计的模式已经不适合新功能了,如果还一直用堆代码的方式,会导致代码越堆越乱。因此重构是非常常态的,也是个人编程实践能力的体现。

2022 年 OceanBase 数据库大赛初赛还会继续使用 MiniOB。我们的目标是没有变的,想要吸引更多的同学去上手学习数据库开发,帮助大家从 0 到 1 打造自己的数据库。基于上一届的经验,今年会提供更多的入门教程,包括 MiniOB 理论知识及 OceanBase 相关的内容,让大家更容易去上手开发。

不管是否参加比赛,只要能够坚持跟着课程学习,都会有不少的收获。2022 年大赛还会增加一些题目,提高 2021 年大赛进阶题目的难度,设计题目之间交叉,加大测试难度,尽可能覆盖更多的数据库理论知识。