在C被当做“高级语言”,雷布斯和小马哥还在写代码的年代,数据库还不是一个成熟的事物。
和很多技术从简单到复杂的发展历程不太一样,数据库首先成熟并被大规模使用的是RDBMS(关系型数据管理系统),后来才逐渐兴起了实现相对简单,以Redis为代表的KV型的数据库。
数据库从后端的技术上看是一个算法、数据结构、系统工程、性能优化的交汇点。
笔者一直对数据库领域充满了兴趣,前前后后主导和参与了很多数据库及相关系统的开发。这三年的主要业余时间都在研究数据库,由于大多数数据库项目都历史悠久,代码量基本都在50万行以上,阅读起来让人颇感头疼。咬牙坚持了两年,有了一点点心得。
因此决定写一个代码量尽量少,但又能有现代数据库的基本架构的项目,于是花了一周时间写了“GOSQLDB”。
“GoSQLDB”是一个研究目的的支持SQL查询的关系型数据库。主要目标是为了向数据库爱好者展示一个关系型数据库的基本原理和关键设计。
因此,为了便于理解,采取了很多取巧但不是很严谨的设计,代码量控制在了行左右(包含了多行的单元测试代码)。
特性列表
纯Golang实现,不依赖任何第三方包。仅在单元测试中引入了goconvey
单元测试覆盖率≈73.5%
存储引擎
1、基于B+Tree的数据检索结构
2、基于4KB分页的磁盘持久化引擎
3、接近POD(PlainOldData)的序列化反序列化
SQLParser
1、Tokenizer基于text/scanner实现
2、支持简单的SELECT、INSERT语法
3、SELECT支持数值类型的WHERE
4、支持LIMIT,但暂不支持ORDERBY
5、如果你想要了解可以生产可用的SQLParser是如何实现的,请参考我从
6、CrockroachDB剥离的SQL-标准支持的SQLParser[1]
执行计划Planner
1、基于火山模型(VolcanoModel)的Select实现[2]
2、基于HTTP的查询和插入接口
实现的局限
1、暂时没有实现DDL,仅有固定的SchemastructRow{Iduint32SexbyteAgeuint8Username[32]byteEmail[]bytePhone[64]byte}
2、SQL语法的有限支持,参见单测用例[3]
Tokenizer由于是基于Golang语言本身的一个取巧实现,对于一些字符串里的特殊字符支持会出现问题,可以通过加“解决
传送门
GitHub