通配符列是指列名由通配符組成的列,多用于模糊匹配、動態列寫入等場景,可以更靈活地匹配和查找目標列。在Lindorm寬表引擎中使用通配符列,可以滿足多數據類型動態寫入的需求。本文介紹通配符列的使用限制及使用方法。
背景信息
在大數據量的場景下,傳統SQL通常無法滿足業務需求。例如車聯網場景,數據通常有幾百甚至上千個列,且這些列多數情況下并不是固定的。如果此時想要寫入新的列,則需要執行ALTER TABLE語句,這樣的操作非常影響寫入效率。
Lindorm支持動態列,可以動態寫入數據并執行查詢。但動態列支持的數據類型較少,目前僅支持VARBINARY類型的數據寫入。為解決這一問題,Lindorm推出通配符列,幫助您實現多數據類型動態列的寫入。
通配符列名目前支持的通配符為星號(*)和英文問號(?)。系統會將通配符匹配到的列中的數據轉換為指定數據類型。詳細規則如下:
英文問號(?)可以匹配任何單個字符。
星號(*)可以匹配任意字符序列,包括空字符序列。
例如,在表結構中加入通配符列c* int
,則可以任意寫入列名以“c”開頭的列(例如c10、c11、c20等),并且這些列中的數據都會被轉換為INT數據類型。
前提條件
使用限制
通配符列不能作為主鍵。
對于包含通配符列的表,使用
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');