UNPKG

devilfish-dbms

Version:

a database that based on key-value map and is successful in deal with saved in disk and high-performance in select that act as a memory-based database

603 lines (368 loc) 18.3 kB
# Devilfish DBMS 用户手册 & API 使用说明 Devilfish DBMS 是一款高性能的数据库管理系统,专为高维数据处理、分析与可视化设计,支持丰富的 SQL 扩展、机器学习、张量操作、数据导入导出等功能。支持 HTTP API 及命令行两种操作方式。 # 启动方式 ```bash # Download and install nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash # in lieu of restarting the shell \. "$HOME/.nvm/nvm.sh" # Download and install Node.js: nvm install 22 # Verify the Node.js version: node -v # Should print "v22.17.1". nvm current # Should print "v22.17.1". # Verify npm version: npm -v # Should print "10.9.2". npm install -g cnpm --registry=https://registry.npmmirror.com git clone https://gitee.com/mumu2009/devilfish-dbms.git cd devilfish-dbms cnpm install node api.js ``` #### 注意,high-vx.x-cluster的启动方式有部分不同,详见./high-v3.0-cluster/readme.md --- ## 一、系统特性 - 高维数据存储与查询 - 分区表支持(基于哈希分区) - 多种索引与聚类算法(复合索引、金字塔索引、递归球面编织、KMeans等) - SQL 扩展与批量操作 - 机器学习模型(线性回归、朴素贝叶斯、多项式拟合等) - 张量创建与运算 - 数据可视化与 Web 可视化文件生成 - 数据压缩与解压缩(黎曼球面映射压缩) - 扩展模块与脚本支持 - 数据导入导出能力(CSV等) - 模糊函数与泰勒展开 - 交集点插入与几何运算 ##### 在本数据库中 每个表最大只能一次性初始化2^29个字符,也就是说 所有的sql语句的长度不能超过2^29=536870912=524.288MB个字符,在执行脚本时为整个脚本的长度不应超过这一限制 --- ## 二、API 启动与基础信息 - 默认监听端口:`3125` - 支持外网访问(监听 `0.0.0.0`) - 支持 CORS 跨域 - 支持 JSON URL 编码表单请求 ### 1. `/execute` 路由 - **方法**:POST - **参数**:JSON 格式,需包含 `command` 字段 - **返回**:执行日志文本 #### 示例请求 ```json POST /execute { "command": "create database test" } ``` #### 返回示例 ``` Database created Command executed successfully ``` --- ## 三、命令总览 #### 注意,下文中的指令除单列一行进行说明外,功能一般同mysql的同名命令。标有'*'的功能表示下个版本开放,标有'**'的功能则会在之后的版本中开放(不包含下一个版本)所有的功能后均没有分号,以换行为下一条指令的标志 ### 1. 数据库管理 - `create database <database_name>` - `use <database_name>` - `drop database <database_name>` - `show databases` - `clone database <source_database> to <target_database>` - `mount database from ./path` - `demount database` ### 2. 表管理 - `create table <table_name> (<column1>,<column2>, ...) partition by <partition_key> partitions = <num_partitions>` 注意,这里'()'内不能有空格,支持指定分区数量,默认有10个基于hash(partition_key)的分区 同时,由于硬盘存储的限制,目前必须有id字段(如果为硬盘表),同时id项不能为0,建议id项放在末尾 如果想要更改重新加载后的必须有的字段,可以搜索并修改loaddataasync和_loadsignalDatabase方法中的partitionKey的值 - `add dimension <column_name> to <table_name>` 这里表示在一个表上添加一个维度(字段) - `remove dimension <column_name> from <table_name>` 这里表示在一个表上删除一个维度(字段) - `drop table <table_name>` - `show tables` - `clone table <source_table> to <target_table>` ### 3. 数据操作 #### 基础操作 - `insert into <table_name> values {<key1>:<value1>, ...}` - `insert batch into <table_name> values [{...}, {...}]` 批量插入,每一个{}中的内容同上一个insert into 指令中的values值,在数据量较大时有优势,数据量小时有劣势 每一次插入的最大值最好不要超过72MB 否则无法保证数据库的稳定性 #### 更新操作 - `update <table_name> set <column>=<new_value> where <condition>` 注意condition不能省略 - `update batch <table_name> set [{key:<primary_key_value>, newData:{<field1>:<value1>, ...}}, ...]` 批量更新多行记录 - `update batch column <table_name> set {<field1>=<value1>, <field2>=<value2>} where <condition>` 批量更新指定条件下的列 #### 删除操作 - `delete from <table_name> where <condition>` 注意condition不能省略,支持主键精确匹配O(1)操作 #### 查询操作 - `select * from <table_name> where <condition>` - `select <column1>,<column2>,... from <table_name> where <condition>` #### 条件语法支持 支持复杂的WHERE条件: - 基础比较:`=`, `>`, `<`, `>=`, `<=`, `<>` - 逻辑运算:`AND`, `OR`, `NOT` - 子查询:`{column:target_column, subquery:SELECT statement}` ### 4. 索引与高维空间 **注意:所有的索引在同一时间只能有一个,所有的索引都可以动态增/删/改,但是速度较慢,建议在多次插入时直接删除索引并重建** #### 复合索引 - `create composite index on <table_name> dimensions <dimension1>,<dimension2>,...` 复合索引,基于表上的维度 - `query composite index on <table_name> with dimensions {dim1:[min,max], dim2:[min,max], ...}` 根据索引composite index,查找dim范围内的信息 - `destroy composite index on <table_name>` #### 金字塔索引 - `create pyramid index on <table_name> with max_capacity=<max_capacity> and k=<k>` 金字塔索引(树状索引),基于表,max_capacity决定了叶层中每个叶上的点个数,建议max_capacity>k - `query pyramid index on <table_name> with point=[x,y,...]` 根据索引pyramid index查找距离某一点最近的k个点 - `destroy pyramid index` #### 递归球面编织索引 - `create recursive sphere weaving on <table_name>` 递归球面编织为集合索引,将高维点折射到低维 - `query recursive sphere weaving on <table_name> with point=[x,y,...] with k=<k>` - `query recursive sphere weaving on <table_name> with point=[x,y,...]` 根据索引recursive sphere weaving查找距离某一点最近的k个点(默认5个) - `destroy recursive sphere weaving` ### 5. 数据可视化 - `visualize <table_name> with <dimensions>` 加载完成后,可以在API的'/'下查看(get),该选项dimensions应为三个分量,但注意,只有前两个分量有用,根据这两个分量数据点将被映射到球面上 ### 6. 脚本与扩展 #### 扩展管理 - `load extension <extension_path>` - `extension <extension_name> <command> [args...]` - `remove extension <extension_name>` - `show extensions` #### 脚本执行 - `execute script <script_path>` 这里的script为一个命名为*.sql的文件,文件中是由sql语句组成的组合 例: ```sql sql1 sql2 sql3 ``` ### 7. 数据生成与噪声 #### 注意:这些功能需要先加载 ai-direction 扩展模块: ``` load extension main-ai-direction.js ``` #### 数据点生成 - `generate points on <table_name> with distribution <distribution_type> and parameters {<param1>:<value1>, ...}` 支持的分布类型: - uniform: 均匀分布,参数格式:`{numPoints:100, x:{min:0,max:10}, y:{min:0,max:10}}` - normal: 正态分布,参数格式:`{numPoints:100, x:{mean:0,stdDev:1}, y:{mean:0,stdDev:1}}` - sphere: 球面分布,参数格式:`{numPoints:100, radius:1}` - `extension ai-direction generate <table_name> <distribution_type> <count> <param1> <param2>` 生成指定分布的数据点并插入表中 - distribution_type: normal/gaussian(正态分布)或 uniform(均匀分布) - count: 生成的点数 - 正态分布参数:mean(均值), stdDev(标准差) - 均匀分布参数:min(最小值), max(最大值) - `extension ai-direction addnoise <table_name> <noise_type> <column> <param1> <param2>` 为表中指定列添加噪声 - noise_type: gaussian(高斯噪声) - column: 目标列名 - 高斯噪声参数:mean(均值), stdDev(标准差) ### 8. 数据压缩与解压缩 #### 压缩对性能损失较大,最好不要启用压缩功能,默认该选项为disable - `enable compression for <table_name>` - `disable compression for <table_name>` **系统采用黎曼球面映射压缩算法,支持有损压缩,适用于高维数据降维存储** ### 9. 数据导入与导出 - `import csv <table_name> from <file_path>` 从CSV文件导入数据,支持自动类型推断和数据清理 ### 10. 几何运算与数学分析 #### 模糊函数与泰勒展开 - `get fuzzy function <table_name> on <dimension1> and <dimension2>` 获取基于两个维度的模糊函数 - `taylor expand <table_name> on <dimension1> and <dimension2> at (<x0>,<y0>) order <order>` 在指定点进行泰勒展开 #### 交集点插入 - `insert intersection into <table_name> dimensions <dimension1>,<dimension2>,... function <function_expression> radius <radius> resolution <resolution>` 计算函数与球面的交集点并插入表中 ### 11. 聚类分析 - `kmeans cluster <table_name> on <dimension1>,<dimension2>,... with k <k>` 对指定维度执行K-means聚类,支持多维数据聚类,结果将添加cluster_label字段 ### 12. SQL 扩展与统计分析 #### 注意:这些功能需要先加载 sql-direction 扩展模块: ``` load extension main-sql-direction.js ``` #### 逻辑运算 - `extension sql-direction or <table_name> <query1> <query2>` 对两个查询结果执行 OR 操作,返回并集 - `extension sql-direction and <table_name> <query1> <query2>` 对两个查询结果执行 AND 操作,返回交集 #### 表连接 - `extension sql-direction join <table_name1> <table_name2> <join_key>` 基于指定键对两个表执行内连接 #### 排序与限制 - `extension sql-direction order <table_name> <column> [asc|desc]` 按指定列对结果进行升序或降序排序(默认升序) - `extension sql-direction limit <table_name> <limit_number>` 限制返回结果的数量 #### 数据选择与复制 - `extension sql-direction select <table_name> <new_table_name> <query>` 将查询结果插入到新表中 #### 统计函数 - `extension sql-direction average <table_name> <column>` 计算指定列的平均值 - `extension sql-direction amount <table_name>` 返回表中记录的总数 - `extension sql-direction variance <table_name> <column>` 计算指定列的方差 - `extension sql-direction min <table_name> <column>` 返回指定列的最小值 - `extension sql-direction max <table_name> <column>` 返回指定列的最大值 - `extension sql-direction sum <table_name> <column>` 计算指定列的总和 - `extension sql-direction median <table_name> <column>` 计算指定列的中位数 #### 分组与聚合 - `extension sql-direction group <table_name> <group_column> <aggregate_column> <aggregate_function>` 按指定列分组并应用聚合函数(sum, avg, min, max, count) - `extension sql-direction having <table_name> <group_column> <aggregate_column> <aggregate_function> <condition>` 对分组结果应用 HAVING 条件过滤 #### 子查询与存在性检查 - `extension sql-direction exists <table_name> <sub_query>` 检查子查询是否返回结果 #### 数据格式化 - `extension sql-direction round <table_name> <column> <precision>` 将指定列的数值四舍五入到指定精度 - `extension sql-direction format <table_name> <column> <format_string>` 使用格式字符串格式化指定列(支持 {} {value} 占位符) ### 13. 机器学习扩展 #### 注意:这些功能需要先加载 ai-direction 扩展模块: ``` load extension main-ai-direction.js ``` #### 线性回归 - `extension ai-direction createlinear <table_name> <features> <target>` 创建线性回归模型 - features: 特征列名,多个用逗号分隔 - target: 目标列名 - `extension ai-direction predictlinear <table_name> <value1> <value2> ...` 使用线性回归模型进行预测 #### 朴素贝叶斯 - `extension ai-direction createbayes <table_name> <features> <target>` 创建朴素贝叶斯模型 - features: 特征列名,多个用逗号分隔 - target: 目标列名 - `extension ai-direction predictbayes <table_name> <value1> <value2> ...` 使用朴素贝叶斯模型进行预测 #### 多项式拟合 - `extension ai-direction polynomial <table_name> <degree> [x_column] [y_column]` 对数据进行多项式拟合 - degree: 多项式阶数 - x_column: X轴列名(默认为'x') - y_column: Y轴列名(默认为'y') #### 张量操作 - `extension ai-direction createtensor <tensor_name> <rows> <cols>` 创建指定形状的张量(当前仅支持2D张量) - `extension ai-direction tensor <operation> <tensor1_name> [tensor2_name]` 执行张量运算 - operation: transpose(转置), add(加法), multiply(矩阵乘法) - 转置操作只需一个张量,其他操作需要两个张量 ### 14. 其它功能 - `exit` - `-- <comment>`(注释行,以--开头的行会被忽略) - `load all`重新从硬盘中加载数据 --- ## 四、高级特性说明 ### 1. 分区表架构 - 采用哈希分区策略,根据分区键自动分配数据到不同分区 - 支持自定义分区数量,默认10个分区 - 主键查询支持O(1)直接定位分区 - 分区间负载自动均衡 ### 2. 压缩算法 - 采用黎曼球面映射压缩算法 - 支持高维数据到低维的有损压缩 - 圆锥投影技术实现空间数据压缩 - 可配置压缩参数和焦点 ### 3. 索引优化 - 复合索引支持多维范围查询 - 金字塔索引提供k近邻搜索 - 递归球面编织实现高维数据降维索引 - 索引动态维护,支持实时更新 ### 4. 查询优化 - 主键查询自动优化为O(1)操作 - 复杂条件查询支持索引加速 - 查询结果缓存机制 - 分区剪枝优化 --- ## 五、日志与调试 - 所有命令执行日志会通过 `console.log` 输出,并写入 `dbms.log` 文件。 - `/execute` 路由返回本次命令的所有日志输出。 - 所有 `console.log(obj)` 会自动转为 JSON 字符串,便于日志分析。 - 支持DEBUG、INFO、WARN、ERROR四个日志级别 --- ## 六、批量导入与性能建议 - 大批量插入时建议关闭自动持久化,插入完毕后再手动保存数据库。 - 大批量导入时建议删除所有索引,导入完成后再重建索引。 - `insert batch` 指令不自动保存,建议插入或更改一条工具表数据以触发保存。 - 使用批量更新命令提高大量数据修改的性能 - 合理设置分区数量以优化查询性能 --- ## 七、Web 可视化 - 访问 `http://<服务器IP>:3125/entrence` 可查看 `entr.html` 页面(需自行开发前端)。 - 支持生成points.json可视化数据文件 - 支持三维球面投影可视化 --- ## 八、扩展与自定义 - 支持通过 `load extension 扩展路径` 加载自定义扩展 - 扩展需导出包含execute对象的模块 - 支持扩展的动态加载、卸载和管理 - 内置ai-direction和sql-direction扩展模块 --- ## 九、常见问题 - 数据库文件损坏修复:如遇 `incorrect header check`,请执行 `node repairdb.js` 查看说明。 - 速度过低:注意剩余内存,本数据库的性能极大地取决于内存量 - 分区键选择:建议选择数据分布均匀的字段作为分区键 - 索引选择:根据查询模式选择合适的索引类型 - 压缩使用:仅在存储空间紧张时启用压缩功能 --- ## 十、示例:通过 HTTP 执行命令 ```bash # 创建数据库 curl -X POST http://localhost:3125/execute -H "Content-Type: application/json" -d "{\"command\":\"create database test\"}" # 使用数据库 curl -X POST http://localhost:3125/execute -H "Content-Type: application/json" -d "{\"command\":\"use test\"}" # 创建表 curl -X POST http://localhost:3125/execute -H "Content-Type: application/json" -d "{\"command\":\"create table users (id,name,age) partition by id partitions = 5\"}" # 插入数据 curl -X POST http://localhost:3125/execute -H "Content-Type: application/json" -d "{\"command\":\"insert into users values {id:1, name:Alice, age:25}\"}" # 查询数据 curl -X POST http://localhost:3125/execute -H "Content-Type: application/json" -d "{\"command\":\"select * from users where id=1\"}" ``` --- ## 十一、完整示例工作流 ```sql -- 创建和使用数据库 create database analytics use analytics -- 创建分区表 create table sales_data (id,region,amount,date) partition by region partitions = 8 -- 批量插入数据 insert batch into sales_data values [ {id:1, region:north, amount:1000, date:2024-01-01}, {id:2, region:south, amount:1500, date:2024-01-02}, {id:3, region:east, amount:1200, date:2024-01-03} ] -- 创建复合索引 create composite index on sales_data dimensions region,amount -- 范围查询 query composite index on sales_data with dimensions {region:[north,south], amount:[1000,2000]} -- K-means聚类 kmeans cluster sales_data on amount,id with k 3 -- 数据可视化 visualize sales_data with amount,id,region -- 加载扩展并执行统计 load extension main-sql-direction.js extension sql-direction average sales_data amount extension sql-direction group sales_data region amount sum ``` --- 如需更多命令或高级用法,请查阅源码或联系开发。