本文作为 Code Insight 目录,梳理 h2 数据库的知识点以及感兴趣的实现细节。
作为一个教学演示用的数据库,性能优化肯定不是其优势,重点在协议、SQL规范实现的思路和解决方案上。❌
h2 数据库提供DBMS 完整的实现、丰富的特性和其简练的实现,通过了解其设计思路,举一反三,在日常开发设计、MySQL 数据库深度研究都有借鉴意义。✔
核心实现的原理分析会持续更新、补充链接。
概览🎯
①简介
h2 数据库支持嵌入式(开源产品 demo 演示)和服务器模式,可以使用磁盘存储(B 树索引存储引擎、日志结构存储引擎)或内存数据库,并提供事务支持和多版本并发控制(MVCC)。
同时还提供了一个基于浏览器的控制台应用程序(JavaWeb),支持加密数据库和全文搜索(based on Apache Lucene)等扩展特性。功能非常丰富,使用Java 编写,可以作为学习数据库原理和架构的范例。
②相关技术点
- 数据库文件协议实现
- 磁盘页存储和缓存交互实现
- SQL 语法解析器(递归下降分析器)
- 搜索算法(B 树、R-Tree、LSM、全文搜索、多维搜索)
- 数据存储结构实现
- ACID
- clustering
- 快照、checkpoint、MVCC 实现
- ANSI-SQL89 规范实现
- SQL Injection
- JDBC 协议实现
- TCPServer 实现
- Http Web Server 实现
- JSP 协议实现
③参考信息
-
H2 使用教程 10min 带你玩转 H2 数据库 😀
-
H2 支持的SQL 语法 增删改查、存储过程、触发器等,兼容 ANSI-SQL89 规范。
- H2 特性介绍和原理 Code Insight 主要参考资料
- How to 阅读 h2 数据库源码
核心实现✨
目录结构参考 官网介绍架构 的 Top-down Overview。
结合关系型数据库和 DBMS 相关的知识点,理论结合实际,深入理解数据库思想。
flowchart TD
L1["① JDBC Driver<br/>org.h2.Driver"]
L2["② Connection/Session<br/>org.h2.engine.Database"]
L3["③ SQL Parser<br/>org.h2.command.Parser"]
L4["④ Command Execution<br/>org.h2.command.dml"]
L5["⑤ Table/Index<br/>org.h2.table / index"]
L6["⑥ Undo/Redo/Transaction<br/>Shared redo + per-session undo"]
L7["⑦ B-Tree Engine<br/>org.h2.store"]
L8["⑧ MVStore Engine<br/>Log-structured KV store"]
L9["⑨ Filesystem<br/>org.h2.store.FileStore"]
L1 --> L2
L2 --> L3
L3 --> L4
L4 --> L5
L5 --> L6
L6 --> L7
L7 --> L9
L6 -.-> L8
L8 -.-> L9
①JDBC driver.
org.h2.Driver/org.h2.jdbcxJDBC 客户端 API 层,提供标准
java.sql.Driver实现,支持嵌入式与服务器模式连接。
②Connection/session management.
org.h2.engine.Database(根实例)
org.h2.engine.SessionInterface/Session(本地) /SessionRemote(远程)管理数据库根实例,封装本地会话与远程会话的差异,处理连接生命周期和并发控制。参考 Database URL Overview 了解 URL 连接和配置示例。
③SQL Parser.
org.h2.command.ParserSQL 语法解释器使用递归下降分析器(recursive-descent),按照语法规则解析输入的文本。有性能问题,优点是易于实现和理解。
④Command execution and planning.
package org.h2.command.dml/org.h2.command.ddl
org.h2.expression.Expressionh2 没有生成查询 IR(中间表示)这一中间步骤,而是直接生成一个命令执行对象。然后对命令对象进行一些优化步骤(
org.h2.expression.Expression#optimize),生成更有效的命令。
相关文章:
- Insight H2 database auto increment
- Insight H2 database 数据查询核心原理
- Insight h2database 执行计划与选择性
- Insight h2database SQL like 查询
⑤Table/Index/Constraints.
org.h2.table.RegularTable
org.h2.mvstore.db.MVTable
org.h2.index.PageBtreeIndexRegularTable 采用常用的数据表实现方案,使用 B-Tree 索引结构,聚集索引数据存储等。
MVTable 是基于新一代的存储引擎 MVStore 实现的数据表实现。
🎈 索引在 H2 内部作为特殊类型的表存储。
相关文章:
⑥Undo log, redo log, and transactions layer.
undo log:每个会话独立的撤销日志,用于回滚操作或撤销失败的更改,通常以内存中的操作列表形式维护。
redo log(transaction log):所有会话共享的重做日志,用于在崩溃后恢复数据库。
在 MVStore 引擎中,不再需要独立的 undo log 机制。
相关文章:
⑦B-tree engine and page-based storage allocation.
org.h2.store基于 B-tree 的存储引擎,按页(通常 2 KB)分配磁盘存储,B-tree 组织数据以实现快速检索和更新。
B树是一种树状数据结构,用于组织和存储数据,可用于在大量数据集中快速查找和访问数据。针对磁盘存储介质,实现数据快速检索和更新。
相关文章:
⑧MVStore storage engine
MVStore 是一种持久化的、基于日志结构的键值存储。用作新版本 H2 的默认存储引擎。
H2 数据库官网特有一章节用来描述 MVStore。
这种引擎将修改的数据缓存在内存中,然后在累积足够的修改后,将它们一次性写入磁盘。这种方式可以提高写入性能,特别是对于不支持小随机写入的文件系统和存储系统(如Btrfs),以及SSD。
每个修改集合称为一个“chunk”,其中包含了所有被修改的B树的父节点和根节点,以及元数据。
为了重用磁盘空间,会压缩具有最少活动数据的chunk。与传统存储引擎相比,这种引擎更简单、更灵活,并且通常需要更少的磁盘操作。
⑨Filesystem abstraction.
org.h2.store.FileStore
org.h2.mvstore.OffHeapStore文件系统抽象层,对随机访问文件存储进行抽象,使内存、磁盘、zip 文件等存储介质对上层表现一致。封装了 seek、readFully、write、sync 等方法,屏蔽了具体存储(也可以使用堆外存储)的实现细节。
ByteBuffer.allocateDirect