自己动手写SQL查询引擎-总篇

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

自己动手写SQL查询引擎-总篇

本篇Blog在总体层面介绍了SQL查询引擎Rider的功能及设计,其细节部分将会在后面的篇章中一一道来。

起因

笔者在实际工作中经常需要解析文件,每次文件稍有变化,都得拷贝粘贴一堆代码。
于是就想着能不能做一个通用的服务,通过配置的方式解析文件。

配置通用

最通用的方法就是自己定义一个文件描述语言,用语言去描述文件的组织结构。但如果自己定义一套新的语法,学习成本则太高。

基于SQL

于是就想到了数据库,数据库是通过create table来表示文件格式的,且通过sql来查询底层数据。
这个create table和select操作和我的需求match,就这样SQL查询引擎Rider诞生了。

Rider代码灵感

Rider借鉴了不少项目的代码,例如MySql协议部分借鉴了Corbar。
Sql解析部分借鉴了h2database,derby等。
文件解析部分源于笔者写的大部分文件解析业务代码。
在此向上述优秀的开源代码致敬。

SQL查询引擎Rider

Rider是一个基于Netty通讯框架的纯java写的Server,其不依赖其它任何服务。其主要功能如下图所示:
rider_func
(1)Rider基于MySql协议和用户交互,用户可以使用mysqlClient、jdbc以及odbc等对Rider发送SQL命令
(2)Rider支持select join where condition、create table等语法
(3)Rider支持MyBatis

Rider总体设计

rider_archetype
这里Rider主要分四层:
(1)MySql协议层,负责通过MySql协议与用户的交互,详情可见:
https://my.oschina.net/alchemystar/blog/834150
(2)Sql解析层:负责对select以及create table等语法的解析
(3)Access层:提供游标Cursor这个概念,供Sql解析层去遍历记录
(4)Storage层:对很多中文件格式进行解析,统一封装成游标Cursor给上层调用,
当前Storage还包含了视图的概念,这是Rider另一个特性,在后面的篇章中阐述。

Rider查询表的原理

下图是Rider查询表的原理,
rider_execute
Rider查询表的原理是通过将文件中所有记录读取出来并通过where或者join条件进行遍历,从而筛选出对应的记录。
对于多表查询,则是通过将多个文件中的记录进行笛卡尔积的便利来筛选记录。

Rider文件配置的通用性

文件列位置不定

详细描述:文件A,文件B包含相同的数据,只是列的位置不一样,例如:
文件A:

1,lancer,lancer_comment   
2,rider,rider_comment

文件B:

1.lancer_comment,lancer    
2,rider,rider_comment  

在Rider中只需要在不同的schema中建立两张相同的表t_test,就可以在应用端代码复用,底层细节的Rider全包了。

use schemaA;
create table t_test( 
  id BIGINT comment 'id test ', 
  name VARCHAR comment 'name',
  extension VARCHAR comment 'extension' 
)Engine='archer' SEP=',' comment='just for test';
use schemaB;
 create table t_test( 
  id BIGINT comment 'id test ', 
  extension VARCHAR comment 'extension' /*此处列位置调整*/
  name VARCHAR comment 'name',
)Engine='archer' SEP=',' comment='just for test'

这样客户端就可以不考虑文件列的位置了。

文件格式不固定

考虑到三个文件,文件A、文件B以及文件C
文件A,以,分隔:

1,lancer,lancer_comment   
2,rider,rider_comment

文件B,以|分隔:

1|lancer|lancer_comment   
2|rider|rider_comment

文件C,XLSX格式

use schemaA;
create table t_test( 
  id BIGINT comment 'id test ', 
  name VARCHAR comment 'name',
  extension VARCHAR comment 'extension' 
)Engine='archer' SEP=',' comment='just for test';
use schemaB;
 create table t_test( 
  id BIGINT comment 'id test ', 
  name VARCHAR comment 'name',
  extension VARCHAR comment 'extension' 
)Engine='archer' SEP='|' /*此处分隔符调整为|*/  comment='just for test'
use schemaC;
create table t_test( 
  id BIGINT comment 'id test ', 
  name VARCHAR comment 'name',
  extension VARCHAR comment 'extension' 
)Engine='XLSX'/*此处引擎调整为xlsx*/;

这样客户端也不需要考虑文件格式了。
如果上述不直观的话,可以如下图所示:
rider_file

Rider性能

文件解析速度4W行/s,其只和java本身文件IO性能相关。

Rider截图

rider_example

github链接

https://github.com/alchemystar/Rider

码云链接

http://git.oschina.net/alchemystar/Rider

原文链接

https://my.oschina.net/alchemystar/blog/865237

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 数据挖掘 数据库
第三篇:高级 SQL 查询与多表操作
本文深入讲解高级SQL查询技巧,涵盖多表JOIN操作、聚合函数、分组查询、子查询及视图索引等内容。适合已掌握基础SQL的学习者,通过实例解析INNER/LEFT/RIGHT/FULL JOIN用法,以及COUNT/SUM/AVG等聚合函数的应用。同时探讨复杂WHERE条件、子查询嵌套,并介绍视图简化查询与索引优化性能的方法。最后提供实践建议与学习资源,助你提升SQL技能以应对实际数据处理需求。
174 1
|
4月前
|
SQL 运维 监控
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
4月前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
8天前
|
SQL
SQL中如何删除指定查询出来的数据
SQL中如何删除指定查询出来的数据
|
2月前
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
|
25天前
|
SQL 存储 弹性计算
OSS Select 加速查询:10GB CSV 文件秒级过滤的 SQL 语法优化技巧
OSS Select 可直接在对象存储上执行 SQL 过滤,跳过文件下载,仅返回所需数据,性能比传统 ECS 方案提升 10~100 倍。通过减少返回列、使用等值查询、避免复杂函数、分区剪枝及压缩优化等技巧,可大幅降低扫描与传输量,显著提升查询效率并降低成本。
|
4月前
|
SQL 人工智能 自然语言处理
OmniSQL:开源文本到SQL神器!自然语言秒转查询到复杂多表连接等SQL需求
OmniSQL是开源的文本到SQL转换模型,通过创新的数据合成框架生成250万条高质量样本,支持7B/14B/32B三种模型版本,能处理从简单查询到复杂多表连接等各种SQL需求。
390 16
OmniSQL:开源文本到SQL神器!自然语言秒转查询到复杂多表连接等SQL需求
|
4月前
|
SQL 大数据 数据挖掘
玩转大数据:从零开始掌握SQL查询基础
玩转大数据:从零开始掌握SQL查询基础
211 35
|
4月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
4月前
|
SQL 存储 自然语言处理
YashanDB SQL 引擎
YashanDB SQL 引擎