开发者学堂课程【从0到1数据库内核实战教程:【视频】入门实战:MiniOB 概述和环境搭建】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1083/detail/16070
【视频】入门实战:MiniOB概述和环境搭建
内容介绍:
一、MiniOB 介绍
二、MiniOB GitHub/Gitee 使用说明
三、MiniOB 安装与调试
一、MiniOB 介绍
为什么要造 MiniOB?
数据库系统是非常基础的组件,它有以下特点:
学习难度大,要了解非常多的知识,有很多工作经验丰富的人经常使用 mysql 系统,但即使学习使用了很多年也很少有人精通数据库系统。实现难度更大;
数据库系统涉及的知识面非常广,如果要了解或实现一个数据库系统必须对操作系统、内存、网络等知识非常精通才能构建一个比较性能好的数据库系统,这还没有涉及数据库本身领域的一些知识。现在除了单机版数据库还有很多分布式方面的多机房等相关知识,知识面很广;
上手难度大,很难针对入门做数据库;
国内数据库系统发展晚,60年代国外的数据库已经起步,国内是最近几年才开始高速发展,完全的自主产权的国内数据库更是屈指可数,高校人才培养非常少,只有很少部分的学校专门针对数据库开发来培养人才,现在几年国内的数据库厂上都在大力投入数据库领域,因此人才匮乏;
学校在研究生阶段才会开设数据库实现课程,本科只开设如何使用以及基本原理等方面的课。
基于这些背景,做了一个 MiniOB。MiniOB的愿景:
吸引更多的同学参与到数据库系统的研发;让大家有兴趣,有能力去入门做数据库系统。希望同学们通过 MiniOB 的一系列课程能学习到很多数据库的底层原理。
二、MiniOB GitHub/Gitee 使用说明
MiniOB 框架:
MiniOB 是一个有一些基础功能的小数据库,功能模块设计的比较简单,主要为了学习,而且去年才起步,有些模块不是非常完美。如上图,左边是客户单,右边是服务端,通过客户端发起命令,通过网络通信跟服务端的网络模块去通讯触发命令,服务端的网络模块收到请求后送给 Paser 模块,经过词法解析和语法解析转发给 Plan Cache,它不做处理直接丢给 Resolver 模块,它将 Paser 解析出来的语法束(转化成树状结构对它进行描述解释,解释的内容用字符串表示)进一步细化,转化成比如需要查询一张表,把表的名字转化成具体的表对象,如果查询某个字段,那么会转换成对应的字段文字。
还可以做一些提前的预检,比如查询一张表,但是这张表不存在,那么可以提前返回错误,经过 Resolver 阶段会把处理的结果放到下两层 Transformer 和 Optimizer 优化,这两个阶段在有些数据库比如 Mysql 上面成为一个模块叫做优化,这里虽然划分为两个模块,但可能不会按照这个流程来执行,会多次循环在低成本情况下找到一个最优查询方案,Transformer 会根据一些规则去转换让后面的优化器更好的转化,比如在查询表时,有一个条件是 1=1,这个规则永远是真的,那么可以直接把这个条件删掉,经过规则转换后交给优化模块来根据比如统计数据,找到更好的查询路径,比如一个查询语句根据“索引”查数据,它需要判断是直接根据“索引”去查效果更好速度更快还是通过全表遍历更快,有时即使通过“索引”去查也不一定是快的,因为可能有一些回表,比如查了索引后还要再去数据文件里看一下去找对应的数据,如果对应的数据量比较多的话可能没有全表遍历的速度快。所以在这里会做判断然后选择比较好的查询计划,给后面的执行模块,原原本本的按照查询计划进行,去访问一些索引啊,或者去记录管理,访问底层的管理模块,把结果返回给网络模块,再返回给客户端。MiniOB 蛮适合入手学习,结构清晰而且比较简单。
三、MiniOB 安装与调试
1、MiniOB 开发调试环境搭建
编译
开发环境调试现在自测过的有 Make 机器,如果使用 Windows 的话可以使用 Docker如果想自己搭环境的话,需要安装CMake https://cmake.org/download/
可以装比较新的3.20。安装GCC,版本推荐8.3以上,如果操作系统比较老建议装8.3以上的。下载代码,安装依赖库,依赖库之前介绍过。
在文档目录下面 How to build 里会介绍怎么编译依赖库直接装到系统上就可以,如图所示。
编译miniob,还提供了一个 docker 容器,Dockfile 也直接提供出来了,直接在首页上可以看到,如图
可以自己 build 或者直接在官网上面拉。就是这个 oceanbase 开头的,运行起来很简单。
调试
目录上面已经编好了编译好后,build 下有个 bin,bin 下有个 observer 和 obclient,是重点关注的文件,后台运行,如图
运行起来后生成一个文件,调试的时候觉得挺烦人的,可以使用客户端连接上来,进行简单的查询,建表,插数据,在 build 时为了方便调试,建议使用 ddebug 模式进行编译。