億級數據表如何在不影響正常業務使用的情況下添加字段

    在我們實際的開發中經常會遇到億級數據表,如電商中的訂單表,物流表,假設現在有個需要在這個億級數據表添加一個字段來滿足實際的業務需求。

    此時我們面臨的問題是如果直接添加一個字段就可能出現因爲增加字段導致幾個小時的業務不可用的問題(因爲數據表被鎖住了),那麼我們有什麼辦法實現在不影響正常業務使用的情況下添加字段呢?下面我們介紹一種優雅的添加字段的方式。

    第一步定義元數據表,即就是通過元數據方式來擴展主表字段,進而滿足業務的需求並且不影響線上業務的使用,元數據表的設計如下所示:

    元數據表就是用來描述擴展字段的信息,如給訂單表添加用戶名稱(user_name)的字段,用戶名稱字段的類型 String 類型,字段的長度 64 個字符,該字段不是必填字段,字段的創建的時間是 2025-06-01 創建的。後續如果添加的擴展字段就往這個元數據表中添加即可,使用元數據表的目的是方便我們管理和維護擴展字段。

    假設現在有一張數據量很大的訂單表,目前訂單表的字段都是關於訂單的核心業務數據字段,如下所示:

    現在有個需求需要添加用戶的名稱、用戶的下單商品的類型(自營商品或非自營商品)、商品是否爲贈品以及訂單的備註信息到訂單上,針對億級的訂單數據表,我們現在採用擴展表字段的方式實現添加字段,如下是擴展的元數據表存儲的信息:

    當用戶的下單後,通過擴展表來存儲具體的訂單相關的擴展數據如下所示的存儲:

    將在訂單擴展字段數據轉成幾列數據的方式存儲在擴展表中,這樣替代了不用在億級數據量的訂單表的添加字段的方式擴展訂單信息,如下所示的對應關係圖:

    訂單 id=123 的訂單通過與擴展表中的訂單 id 關聯,實現了對訂單的信息添加了用戶名稱、用戶的下單商品的類型、商品是否爲贈品以及訂單的備註信息等數據。

    使用訂單擴展表的方法來擴展訂單信息,實質可以理解爲一種行轉列的方式擴展,這種方式會帶來如下的問題:

(1)擴展表的數據非常的大(訂單的擴展數據也是億級別的)

(2)如果對擴展字段需要作爲查詢條件,那麼如何保證查詢的效率

    針對擴展表的數據非常的大問題,我們可以對擴展表做分表方式存儲數據,按照訂單 id 爲分表的字段,通過 hash 的方式來定位數據存儲在哪張表中,如下所示:

    針對擴展字段作爲查詢條件的時候,爲了保證查詢效率我們可以將數據同步到 es 中,然後通過 es 來查詢數據,如下所示的同步方案:

    那麼整流程的實現方案是先將訂單的擴展字段分表存儲,然後 es 通過監聽 binlog 的方式來同步訂單的數據,流程圖如下所示:

    es 同步通過監聽 binlog 來同步訂單數據的,那麼就會出現一定的時延問題,針對那些對訂單數據時效性不強的業務來講,訂單數據可以從 es 中讀取;如果那些對訂單數據時效性要求很高的業務場景,我們可以從數據表中讀取。

總結:

(1)對億級的數據擴展可以採用元數據表 + 行轉列的擴展表來實現對主表數據的擴展,這樣的優勢是不會影響業務的正常使用的情況下優雅的擴展主表數據。

(2)擴展表的數據也是非常的大,可以考慮對擴展表做分表處理。

(3)爲了保證訂單的查詢效率,我們可以採用 es 來實現訂單的查詢效率。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/yNytQtjbhB36xMnKTmyoQw