通配符列是指列名由通配符组成的列,多用于模糊匹配、动态列写入等场景,可以更灵活地匹配和查找目标列。在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');