全部產品
Search
文件中心

Lindorm:萬用字元列

更新時間:Jul 06, 2024

萬用字元列是指列名由萬用字元組成的列,多用於模糊比對、動態列寫入等情境,可以更靈活地匹配和尋找目標列。在Lindorm寬表引擎中使用萬用字元列,可以滿足多資料類型動態寫入的需求。本文介紹萬用字元列的使用限制及使用方法。

背景資訊

在巨量資料量的情境下,傳統SQL通常無法滿足業務需求。例如車連網情境,資料通常有幾百甚至上千個列,且這些列多數情況下並不是固定的。如果此時想要寫入新的列,則需要執行ALTER TABLE語句,這樣的操作非常影響寫入效率。

Lindorm支援動態列,可以動態寫入資料並執行查詢。但動態列支援的資料類型較少,目前僅支援VARBINARY類型的資料寫入。為解決這一問題,Lindorm推出萬用字元列,協助您實現多資料類型動態列的寫入。

萬用字元列名目前支援的萬用字元為星號(*)和英文問號(?)。系統會將萬用字元匹配到的列中的資料轉換為指定資料類型。詳細規則如下:

  • 英文問號(?)可以匹配任何單個字元。

  • 星號(*)可以匹配任一字元序列,包括Null 字元序列。

例如,在表結構中加入萬用字元列c* int,則可以任意寫入列名以“c”開頭的列(例如c10、c11、c20等),並且這些列中的資料都會被轉換為INT資料類型。

前提條件

寬表引擎為2.5.3及以上版本。如何查看或升級目前的版本,請參見寬表引擎版本說明升級小版本

使用限制

  • 萬用字元列不能作為主鍵。

  • 對於包含萬用字元列的表,使用SELECT *語句進行查詢時,必須添加LIMIT限制。例如,SELECT * FROM t_dynamic_columns LIMIT 10;

  • 僅支援為萬用字元列建立搜尋索引,不支援二級索引。例如,不支援CREATE INDEX idx on tb(c2*)

  • 不支援使用含萬用字元的列名進行資料查詢。SELECT和WHERE條件中必須填寫實際的列名,不支援填寫萬用字元列名。例如,不支援SELECT c1*,c2 WHERE c2 > 10;SELECT c1*,c2 WHERE c1* > 10;。正確文法例如SELECT pk, c1, c2, c21, c31 WHERE c21 > 10 AND c31 < 'c300'

DDL

建立表tb,設定pk為主鍵列,並在WITH條件中指定萬用字元列c2*c3*,類型分別為BIGINT和VARCHAR。

CREATE TABLE tb(pk integer, c1 varchar, `c2*` bigint, `c3*` varchar, primary key(pk)) WITH(wildcard_column='c2*,c3*');

根據表tb的建立規則,列名以c2開頭(如c2、c21、c22)且資料類型為BIGINT的列,都可以被寫入表tb中;資料類型為非BIGINT但符合匹配規則的列,則會被轉化為BIGINT類型寫入。列名以c3開頭(如c32、c33、c35)且資料類型為VARCHAR的列都可以被寫入表tb中;資料類型為非VARCHAR但符合匹配規則的列,則會被轉化為VARCHAR類型寫入。

搜尋索引

支援為萬用字元列建立搜尋索引。符合萬用字元匹配規則的列,都會被索引至搜尋索引中。

 CREATE SEARCH INDEX IF NOT EXISTS sidx ON tb(`c2*`, `c3*`);

DML

寫入

寫入資料時,寫入列的列名需要滿足以下兩點要求:

  • 符合萬用字元列的匹配規則。

  • 資料類型符合萬用字元列的定義類型。

UPSERT INTO tb(pk, c1, c2, c21, c22, c31) values (1, 'a1', 2, 21, 22, 'c3');