TiDB是如何新建一張表的? 頂 原 薦

TiDB是一個開源分佈式數據庫,並使用Rust編寫的TiKV存儲數據,其中TiDB是一個SQL語法解析層,本文使用MockDB模擬本地存儲數據,從語法解析到實際存儲操作進行分析一張數據表是如何建出來的。
過程如下:

  1. 首先我們得有一個建表語句
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)
)
  1. TiDB拿到一個SQL語句之後,首先需要使用Parser進行語法解析
    上圖中的代碼爲Parser的goyacc語法,最終SQL在Parser中走了一圈之後生成CreateTableStmt的結構,該結構具體的屬性如下圖所示:
  2. 在語法解析完成之後,就需要生一個抽象語法樹AST,TiDB使用火山模型向下鑽取生成語法樹。 !
  3. 如果語法樹生成的沒有問題,接下來就要build一個LogicPlan,當然在build之前我們先進行一些預檢查:
    預檢查主要包括一些表名合法性檢查,列名合法性檢查,約束檢查,主鍵檢查等。
  4. 在確保AST檢查無誤之後,我們開始處理步驟3中生成的AST語法樹。其中在ddl_api.go中我們再做更詳細的檢查,並最終生成一個TableInfo的結構,這個結構中保存了所有表相關的信息。並提交一個類型爲Type: model.ActionCreateTable 的Job。
  5. 在ddl_worker.go接收到步驟5中的Job之後真正開始作爲一個原子操作處理保存TableInfo的任務。其中t.CreateTable(schemaID, tbInfo) 將會真正調用Hash接口的API將TableInfo序列化之後存入後端存儲中。
    在存儲完成之後調用job.FinishTableJob通過前端建表語句已經執行完成。

總結: 目前看起來TiDB的代碼結構相當清晰,由於並未使用任何MySQL客戶端的C語言代碼,所以代碼也相當整潔,稍微花一些時間就能夠瞭解到他是如何實現相關數據庫操作的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章