# MemDb **Repository Path**: MelchorLi/MemDb ## Basic Information - **Project Name**: MemDb - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-04 - **Last Updated**: 2026-06-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MemoryDB — 内存数据库实战项目 > 一个支持 SQL 查询、B+ 树索引、CSV 持久化、JBDC 驱动的内存数据库。 > 使用 Claude Code (DeepSeek-v4-pro) 通过 vibe-coding 方式开发。 > 总 Token 消耗:**513,947,565**,缓存命中:**498,027,008**,花费 **¥17.41**。 --- ## 📖 使用指南 ### 1. 打包 JDBC 驱动 ```bash JAVA_HOME="/c/Program Files/Java/jdk-17.0.18" PATH="/c/Program Files/Java/jdk-17.0.18/bin:$PATH" mvn clean package -DskipTests ``` 产物:`memory-db-jdbc/target/memory-db-jdbc-1.0-SNAPSHOT-jar-with-dependencies.jar` ### 2. 在 DBeaver 中使用 将打包好的 jar 导入 DBeaver: 1. **DBeaver** → 数据库 → 驱动管理器 → 新建 2. 类名:`com.memorydb.jdbc.MemoryDbDriver` 3. URL 模板: - `jdbc:memorydb:embedded:{dbname}` — 嵌入式内存数据库 - `jdbc:memorydb:file:{/path/to/data}` — 持久化到文件 - `jdbc:memorydb:tcp://{host}:{port}` — 远程连接 ![DBeaver 连接配置](data/Dbeaver1.png) ![DBeaver SQL 查询](data/Dbeaver2.png) ![DBeaver 结果](data/Dbeaver3.png) ### 3. 在 IDEA 中运行 ![IDEA 运行截图](data/runAtidea.png) 直接运行 `com.memorydb.server.ServerMain`,默认监听 `3307` 端口。 ### 4. 命令行客户端 ```bash # 启动服务端(默认 3307 端口) java -jar memory-db-server-1.0-SNAPSHOT-jar-with-dependencies.jar # 启动客户端连接 mvn exec:java -pl memory-db-server -Dexec.mainClass="com.memorydb.server.ClientMain" ``` ### 5. Java 代码示例 ```java // 嵌入式 Connection conn = DriverManager.getConnection("jdbc:memorydb:embedded:test"); Statement stmt = conn.createStatement(); // 建表 + 增删改查 stmt.execute("CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR, age INT)"); stmt.execute("INSERT INTO users VALUES (1, 'Alice', 30)"); stmt.execute("INSERT INTO users VALUES (2, 'Bob', 25)"); ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE age > 20"); // 窗口函数 + JOIN ResultSet rs = stmt.executeQuery(""" SELECT Department, Employee, Salary FROM (SELECT e.name AS Employee, e.salary AS Salary, d.name AS Department, DENSE_RANK() OVER (PARTITION BY e.departmentId ORDER BY e.salary DESC) AS r FROM Employee e JOIN Department d ON e.departmentId = d.id) t1 WHERE t1.r <= 3"""); ``` --- ## 🏗 项目架构 ``` MemDb-java/ # Maven 多模块,Java 17 ├── memory-db-core/ # 核心层(1,903 行) │ ├── type/DataType.java # 枚举类型系统(6 种类型) │ ├── storage/Table.java # 表 CRUD + B+ 树索引集成 │ ├── storage/MemoryStorageEngine.java # 线程安全存储引擎 │ ├── storage/index/BPlusTree.java # 泛型 B+ 树 │ ├── persistence/CsvPersistence.java # CSV 持久化 │ └── MemoryDB.java # 主入口 API │ ├── memory-db-sql/ # SQL 层(5,006 行) │ ├── ast/ # 内部 AST(10 个节点类) │ ├── parser/SqlParser.java # JSqlParser → AST │ ├── executor/SqlExecutor.java # AST → 存储引擎 │ ├── metadata/MetadataManager.java # 自管理系统表 │ └── SqlProcessor.java # SQL 入口 │ ├── memory-db-server/ # 网络服务层(438 行) │ ├── ServerMain.java # Netty 启动入口 │ ├── session/SessionHandler.java # SQL 会话处理 │ └── protocol/SimpleTextProtocol.java # 文本协议 │ ├── memory-db-jdbc/ # JDBC 驱动(2,115 行) │ ├── MemoryDbDriver.java # 驱动注册 + URL 解析 │ ├── MemoryDbConnection.java # 嵌入式连接 │ ├── MemoryDbStatement.java / PreparedStatement.java │ ├── MemoryDbResultSet.java / ResultSetMetaData.java │ └── MemoryDbTcpConnection.java # TCP 远程连接 │ └── 21 测试类,169 测试用例,全量通过 ``` --- ## 🧠 Claude Code 开发记录 ### 指令历史与执行统计 | # | 指令 | 核心动作 | 耗时 | |---|------|---------|------| | 1 | `/init` → CLAUDE.md 包含项目规划 | 探索项目 → 生成指导文档 | ~2 min | | 2 | `帮我实现 第一阶段:核心存储` | 创建 Maven 项目结构 + DataType/Column/Row/Table/B+树/CSV/MemoryDB + 38 测试 | ~15 min | | 3 | `帮我完成 CLAUDE.md 里的 第二阶段:元数据与SQL` | 创建 memory-db-sql 模块 + MetadataManager + JSqlParser 集成 + 32 测试 | ~20 min | | 4 | `这个db-sql模块,支持 嵌套select查询吗?` → `好的,现在生成 executor、parser 。使其支持 嵌套查询。` | AST 重构:SqlStatement/Expression/FromClause + SqlParser + SqlExecutor + IN/NOT IN/EXISTS/嵌套/关联子查询 | ~30 min | | 5 | `现在支持group by、聚合函数...如果要支持,应该加在哪里?` → `开始实现` | GROUP BY + COUNT/AVG/SUM/MAX/MIN | ~10 min | | 6 | `如果要支持 CONCAT、UPPER...CASE WHEN...需要加到哪里` → `现在开始` | ScalarFuncExpr + SelectItem.SCALAR_FUNC + 20 个标量函数实现 | ~30 min | | 7 | `如果要实现 DML insert、update、delete...大概需要多少代码?` → `做吧` | InsertStmt/UpdateStmt/DeleteStmt + Parser 3 分支 + Executor 3 方法 | ~10 min | | 8 | `现在 查询 会用到 索引吗` → `加回来。再来个IndexTest` | Executor 索引加速 + CREATE INDEX 支持 + IndexMatch 逻辑 | ~15 min | | 9 | 多行 INSERT + 分号多语句支持 | 修复 convertInsert 的多行解析 + execute 按分号拆分 | ~5 min | | 10 | `现在支持 连表查询吗` → `加入这个功能` | JOIN AST + Parser convertJoin + Executor 嵌套循环连接 + LEFT JOIN | ~25 min | | 11 | `现在支持 ORDER BY 吗` → `加入` | OrderByItem + sortRows + 多列排序 | ~5 min | | 12 | 测试拆分 | 1 个 650 行测试类 → 5 个专项测试类 | ~5 min | | 13 | `当 FROM 为空时...支持 LIMIT/OFFSET 和 DISTINCT` → `实现` | EmptyRef + DISTINCT/LIMIT/OFFSET + 标量子查询 SELECT 项 | ~15 min | | 14 | `jdbc:memorydb:tcp://` 支持 → `加` | MemoryDbTcpConnection/Statement/ResultSet + ServerMain 集成测试 | ~15 min | | 15 | fat jar 打包 | maven-assembly-plugin 配置 | ~2 min | | 16 | `实现 第三阶段:网络与集成 的jdbc` → `现在写` | Driver/Connection/Statement/PreparedStatement/ResultSet/MetaData + 6 测试 | ~25 min | | 17 | `实现 第三阶段:网络与集成` → `先实现 memory-db-server 吧` | Netty Server + 文本协议 + 集成测试 | ~10 min | | 18 | `实现第三阶段的jdbc` → fat jar for server | assembly plugin for server | ~2 min | | 19 | `如果要支持 leetcode185...需要加哪些代码?预计多久` → `实现` | 窗口函数 AST + Parser AnalyticExpression + Executor computeWindowFuncs + DENSE_RANK/RANK/ROW_NUMBER/PARTITION BY | ~30 min | | 20 | 各种 bug 修复(多次)| LONG vs Integer 类型转换、TableMeta 别名、JOIN 同名列前缀、B+树序列化、CSV 多行解析、注释行跳过等 | ~20 min | **总计 CC 执行约 20 次,累计耗时约 5-6 小时(与人交互+等待)。** --- ## ✅ 已完成功能清单 ### DDL - [x] `CREATE TABLE` (PRIMARY KEY, NOT NULL) - [x] `DROP TABLE` - [x] `CREATE INDEX` / B+ 树索引加速查询 ### DML - [x] `INSERT`(含列名/无列名/多行 VALUES) - [x] `UPDATE`(单列/多列/全表/WHERE) - [x] `DELETE`(条件/全表 WHERE) ### DQL - [x] `SELECT`(列投影/别名/表名限定 `e.name`) - [x] `WHERE`(=, !=, >, >=, <, <=, LIKE, AND, OR) - [x] `ORDER BY`(ASC/DESC,多列) - [x] `LIMIT N OFFSET M` - [x] `DISTINCT` - [x] 标量子查询(`SELECT (SELECT ...) AS alias`) ### 聚合函数 - [x] `COUNT(*)` / `COUNT(col)` - [x] `AVG` / `SUM` / `MAX` / `MIN` - [x] `GROUP BY` + 聚合 - [x] `聚合 + WHERE` 组合 ### 标量函数(20 个) - [x] 字符串:`UPPER` / `LOWER` / `TRIM` / `CONCAT` / `SUBSTRING` / `REPLACE` / `LENGTH` - [x] 数学:`ABS` / `ROUND` / `CEIL` / `FLOOR` - [x] 日期:`NOW` / `CURDATE` / `YEAR` / `MONTH` / `DAY` / `DATEDIFF` - [x] 条件:`COALESCE` / `NULLIF` / `IFNULL` ### 子查询 - [x] `IN (SELECT ...)` / `NOT IN` - [x] `EXISTS (SELECT ...)` - [x] 嵌套多级子查询 - [x] 关联子查询(引用外层列) ### JOIN - [x] `CROSS JOIN` / 逗号隐式 JOIN - [x] `INNER JOIN ... ON` - [x] `LEFT JOIN` - [x] 三表 JOIN - [x] JOIN + 聚合 / GROUP BY ### 窗口函数 - [x] `DENSE_RANK() OVER(...)` - [x] `RANK() OVER(...)` - [x] `ROW_NUMBER() OVER(...)` - [x] `PARTITION BY` 分区 - [x] `ORDER BY` 窗口内排序 ### 元数据 - [x] 3 个系统表(`__tables`, `__columns`, `__indexes`) - [x] 自管理(系统表本身也是表) - [x] 索引持久化恢复 ### 持久化 - [x] CSV 导入/导出(schema 文件 + 数据文件) - [x] 多行 CSV 解析(支持引号字段、换行符) - [x] `MemoryDB.open()` 自动加载 - [x] `db.save()` 手动落盘 ### 网络服务 - [x] Netty TCP 服务端 - [x] 文本协议(一行 SQL → 多行结果 + END 结束) - [x] 命令行客户端 ### JDBC 驱动 - [x] `jdbc:memorydb:embedded:{name}` — 嵌入式 - [x] `jdbc:memorydb:file:{path}` — 文件持久化 - [x] `jdbc:memorydb:tcp://{host}:{port}` — 远程连接 - [x] `Statement` / `PreparedStatement` - [x] `ResultSet` / `ResultSetMetaData` / `DatabaseMetaData` - [x] `META-INF/services/java.sql.Driver` SPI 自动发现 - [x] Fat jar 可直接导入 DBeaver --- ## 🚀 未来升级方向 | 特性 | 预计改动 | 简介 | |------|---------|------| | **事务支持 (ACID)** | core + sql ~500 行 | 基于 WAL 或 MVCC 实现 ATOMIC/ISOLATION | | **RBAC 权限管理** | sql ~300 行 | `CREATE USER` / `GRANT` / `REVOKE` + 系统表 `__users` | | **执行计划 / SQL 优化** | planner ~400 行 | 代价估算 + 索引选择 + JOIN 顺序优化 + 谓词下推 | | **多表联合索引** | core + sql ~200 行 | B+ 树支持复合键 | | **查询缓存** | executor ~150 行 | LRU 缓存常见查询结果 | | **存储过程** | sql ~300 行 | `CREATE PROCEDURE` + 简单过程语言 | | **视图** | ast + executor ~200 行 | `CREATE VIEW` / `SELECT * FROM view` | | **子查询物化** | executor ~150 行 | 子查询结果缓存到临时表,避免重复执行 | | **HA/主从复制** | server ~400 行 | 基于 Raft 或简单 leader-follower | | **JSON 数据类型** | core ~150 行 | `JSON` 类型 + `->` / `->>` 操作符 | | **全文索引** | core ~300 行 | 倒排索引 + `MATCH ... AGAINST` | | **性能测试基准** | test ~200 行 | TPC-H 子集 / sysbench 风格测试 | | **查询计划 EXPLAIN** | executor ~100 行 | `EXPLAIN SELECT ...` 输出执行计划 | --- ## 📊 开发数据 | 指标 | 数值 | |------|------| | 模块数 | 4(core, sql, server, jdbc) | | Java 源文件 | 63 个 | | 总代码行数 | 9,462 行 | | 测试文件 | 21 个 | | 测试用例 | 169 个 | | Claude Code 执行次数 | ~20 次 | | 累计耗时 | ~5-6 小时 | | Token 消耗 | 513,947,565 | | 缓存命中 | 498,027,008(命中率 96.9%) | | 花费 | ¥17.41 | --- ## 🚦 快速启动 ```bash # 编译 + 测试 JAVA_HOME="/c/Program Files/Java/jdk-17.0.18" PATH="/c/Program Files/Java/jdk-17.0.18/bin:$PATH" mvn test # 运行 169 个测试 # 启动服务 java -jar memory-db-server/target/memory-db-server-1.0-SNAPSHOT-jar-with-dependencies.jar # 命令行连接 mvn exec:java -pl memory-db-server -Dexec.mainClass="com.memorydb.server.ClientMain" ``` --- **项目开始**:2026-06-02 **最后更新**:2026-06-03