tidb是乙個開源分布式資料庫,並使用rust編寫的tikv儲存資料,其中tidb是乙個sql語法解析層,本文使用mockdb模擬本地儲存資料,從語法解析到實際儲存操作進行分析一張資料表是如何建出來的。
過程如下:
首先我們得有乙個建表語句
create table persons
( id_p int not null,
lastname varchar(255) not null,
firstname varchar(255),
address varchar(255),
city varchar(255),
primary key (id_p)
)
tidb拿到乙個sql語句之後,首先需要使用parser進行語法解析
上圖中的**為parser的goyacc語法,最終sql在parser中走了一圈之後生成createtablestmt的結構,該結構具體的屬性如下圖所示:
在語法解析完成之後,就需要生乙個抽象語法樹ast,tidb使用火山模型向下鑽取生成語法樹。
如果語法樹生成的沒有問題,接下來就要build乙個logicplan,當然在build之前我們先進行一些預檢查:
預檢查主要包括一些表名合法性檢查,列名合法性檢查,約束檢查,主鍵檢查等。
在確保ast檢查無誤之後,我們開始處理步驟3中生成的ast語法樹。其中在ddl_api.go中我們再做更詳細的檢查,並最終生成乙個tableinfo的結構,這個結構中儲存了所有表相關的資訊。並提交乙個型別為type: model.actioncreatetable
的job。
在ddl_worker.go接收到步驟5中的job之後真正開始作為乙個原子操作處理儲存tableinfo的任務。其中t.createtable(schemaid, tbinfo)
將會真正呼叫hash介面的api將tableinfo
序列化之後存入後端儲存中。
在儲存完成之後呼叫job.finishtablejob
通過前端建表語句已經執行完成。
總結:目前看起來tidb的**結構相當清晰,由於並未使用任何mysql客戶端的c語言**,所以**也相當整潔,稍微花一些時間就能夠了解到他是如何實現相關資料庫操作的。
將一張表的資料插入另外一張表
表cmb send sms create table cmb send sms send id bigint 20 not null auto increment comment 主鍵id phone no varchar 32 not null comment 手機號碼 status varcha...
根據一張表去更新另一張表
最近在改乙個專案,由於是別人做好的,很多資料表資訊不全。不得不手工用sql更新資料表。現在又這麼2張表 第一張是管理員表 id 使用者id c id 分公司id p id 部門id name 使用者名稱 第二張是訂單表 id 訂單id com id 訂單所屬銷售的公司id dep id 訂單所屬銷售...
MySQL中update一張表到另一張表
以下的文章主要介紹的是mysql 資料庫中如何將乙個實際應用表的相關資料插入到另外乙個表的實際操作方法,此方案看起來很簡單但是並非如此,雖然這個實現起來非常簡單,但是還是會困擾許多新手,因此專門發一篇文章備查。開發中,我們經常需要將乙個表的資料插入到另外乙個表,有時還需要指定匯入字段,雖然這個實現起...