自己動手寫SQL查詢引擎-總篇
自己動手寫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,其不依賴其它任何服務。其主要功能如下圖所示:
(1)Rider基於MySql協議和使用者互動,使用者可以使用mysqlClient、jdbc以及odbc等對Rider傳送SQL命令
(2)Rider支援select join where condition、create table等語法
(3)Rider支援MyBatis
Rider總體設計
這裡Rider主要分四層:
(1)MySql協議層,負責透過MySql協議與使用者的互動,詳情可見:
https://
my。oschina。net/alchemys
tar/blog/834150
(2)Sql解析層:負責對select以及create table等語法的解析
(3)Access層:提供遊標Cursor這個概念,供Sql解析層去遍歷記錄
(4)Storage層:對很多中檔案格式進行解析,統一封裝成遊標Cursor給上層呼叫,
當前Storage還包含了檢視的概念,這是Rider另一個特性,在後面的篇章中闡述。
Rider查詢表的原理
下圖是Rider查詢表的原理,
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效能
檔案解析速度4W行/s,其只和java本身檔案IO效能相關。
Rider截圖
github連結
https://
github。com/alchemystar/
Rider
碼雲連結
http://
git。oschina。net/alchemy
star/Rider
原文連結
https://
my。oschina。net/alchemys
tar/blog/865237
本文作者:無毀的湖光
原文連結
更多技術乾貨敬請關注雲棲社群知乎機構號:阿里云云棲社群 - 知乎