自己動手寫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,其不依賴其它任何服務。其主要功能如下圖所示:

自己動手寫SQL查詢引擎-總篇

(1)Rider基於MySql協議和使用者互動,使用者可以使用mysqlClient、jdbc以及odbc等對Rider傳送SQL命令

(2)Rider支援select join where condition、create table等語法

(3)Rider支援MyBatis

Rider總體設計

自己動手寫SQL查詢引擎-總篇

這裡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查詢表的原理,

自己動手寫SQL查詢引擎-總篇

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*/;

這樣客戶端也不需要考慮檔案格式了。

如果上述不直觀的話,可以如下圖所示:

自己動手寫SQL查詢引擎-總篇

Rider效能

檔案解析速度4W行/s,其只和java本身檔案IO效能相關。

Rider截圖

自己動手寫SQL查詢引擎-總篇

github連結

https://

github。com/alchemystar/

Rider

碼雲連結

http://

git。oschina。net/alchemy

star/Rider

原文連結

https://

my。oschina。net/alchemys

tar/blog/865237

本文作者:無毀的湖光

原文連結

更多技術乾貨敬請關注雲棲社群知乎機構號:阿里云云棲社群 - 知乎