通配符列

通配符列是指列名由通配符组成的列,多用于模糊匹配、动态列写入等场景,可以更灵活地匹配和查找目标列。在Lindorm宽表引擎中使用通配符列,可以满足多数据类型动态写入的需求。本文介绍通配符列的使用限制及使用方法。

背景信息

在大数据量的场景下,传统SQL通常无法满足业务需求。例如车联网场景,数据通常有几百甚至上千个列,且这些列多数情况下并不是固定的。如果此时想要写入新的列,则需要执行ALTER TABLE语句,这样的操作非常影响写入效率。

Lindorm支持动态列,可以动态写入数据并执行查询。但动态列支持的数据类型较少,目前仅支持VARBINARY类型的数据写入。为解决这一问题,Lindorm推出通配符列,帮助您实现多数据类型动态列的写入。

通配符列名目前支持的通配符为星号(*)和英文问号(?)。系统会将通配符匹配到的列中的数据转换为指定数据类型。详细规则如下:

  • 英文问号(?)可以匹配任何单个字符。

  • 星号(*)可以匹配任意字符序列,包括空字符序列。

例如,在表结构中加入通配符列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');