因为目前项目涉及到数据库查询引擎的实现,所以近来愈发觉得数据库引擎开发是一个很好的技术领域。首先,一个数据库引擎与传统编译器很像,可以细分为三大部分,前端、中端和后端。所谓前端,就是一个SQL解析器把用户的SQL语句转换成语法树(Parse Tree或者叫Concrete Syntax Tree,CST),然后在执行语义检查的同时将其转换成中端所需的输入——抽象语法树(Abstract Syntax Tree,AST)。中端拿到的AST其实就是我们常说的逻辑执行计划(Logical Plan),中端也就叫做Logical Planner。Logical Plan中已经去掉了没用的细节,比如标点符号、括号等,只保留了最终执行所需的语法部分。而Logical Planner最重要的任务就是进行关系代数(Relational Algebra)优化,比如SELECT和WHERE(对应关系模型中的Projection和Selection)中条件的“Push Down”,将其尽可能地移动到AST中越低的位置越好,因为这样可以有效减少载入到内存中的数据量。经过这样的优化后,中端将Logical Plan交给后端进行Physical Planning,即将Logical Plan中每个抽象的逻辑运算符转换成真正可以执行的物理运算符,比如JOIN变成HashJoin,决定要不要使用临时表存储中间结果等等。此外,最终执行时还要确定数据是都在本机还是分片到多台机器,是否要进行分布式执行。最终,最优的Physical Plan就可以执行出用户想要的结果了。

经过前面这样快速地过了一下数据库引擎的三大块,可能大家已经能够感受到它非常“硬核”的一面。

  1. 前端重度依赖编译原理的知识,需要开发者了解如何定义语法,如何进行语义检查。如果是Java开发的话,一般最流行的选择就是ANTLR,自动生成词法和语法解析器(Lexer和Parser)。
  2. 中端则需要深厚的关系理论(Relational Theory,RM)做支撑,理解关系理论的用处,其背后的谓词逻辑系统和推导规则,这些都是Logical Plan优化所需的知识。
  3. 后端则是一直最流行的大数据、多线程、分布式计算等热点领域。

作为一个刚入门的数据库内核开发者来说,这个学习的过程是非常幸福的,因为这里面涉及到的都是计算机科学里最硬核的部分。通过解剖一个数据库内核,也让自己反思平时自己写的代码哪里可以提高。比如开发一个系统或者模块,最重要的是定义好自己的“语言层”。SICP里讲用LISP开发,首先就是根据领域用LISP定制一套语言,然后再实现功能。对于应用开发来说,这个语言可能只是一套Java的API,而不是一个真正的语言,但这里的道理是一定要明白自己的系统能支持哪些、不能支持哪些。

如果不限于计算机科学领域,继续扩展的话,编译原理则与语言密切相关(这里的语言并不限于编程语言)。而关系理论的背后则是所谓的四值谓词逻辑系统(关系理论之父Codd自己的话,RM强就强在这),RM本质上是一个Abstract Machine,这里面隐含着逻辑与计算的微妙关系。此外,查询优化器的实现还涉及到概率统计以及Physical Plan空间的搜索,基本算法有动态规划、贪心算法等,在PostgreSQL中还用到了遗传算法。所以,前面说到的这些领域继续深入学习的话,也是非常有乐趣的。当然,每个开发者的领域不同,不能大家都做一样的项目。但这里强烈建议感兴趣的同学业余时间学习一下数据库理论方面的知识,而不是停留在会写简单的SQL,数据库内核里隐藏的一块宝藏!

推荐阅读材料,按照由浅入深的顺序,大部分应该在网上都能找到电子版:

  1. 《Database Systems: the Complete Book》:一本百科全书式的教材,涉及数据库理论的方方面面。如果只关心本文所讲的引擎部分的话,想跳过数据库设计、范式等其他内容的话,也可以看一下同作者写的《Database System Implementation》,全书都是干货。
  2. 《Applied Mathematics for Database Professionals》:本书可以用来了解数据库理论之下的数学知识,包括逻辑、集合论和关系理论。此书对新手非常友好,浅显易懂。
  3. 《Database in Depth: Relational Theory for Practitioners》:关系理论之父的好友CJ.Date所著,Date的产量惊人,出了很多本关于关系理论的书,有些可能比较重叠,所以重点看几本就好。
  4. 《The Relational Model for Database Management, Version 2》:可能是关系理论之父出版的唯一一本给我们普通人看的书,其他基本都是Paper或学术杂志。建议在看其他书的同时或者最后看此书,因为需要对关系理论有了一定了解,追本溯源,在创造者这才能读懂他的想法。