存储模式

更新时间:
复制 MD 格式

云原生多模数据库 Lindorm 的列存索引底层支持两种存储模式:OLAP 模式(基于 OLAP 引擎的主键表)与 Lake 模式(基于 Iceberg 湖仓列存)。同一份 CREATE INDEX ... USING COLUMNAR DDL 在两种模式下语法完全一致,用户无需修改 SQL,即可通过实例侧配置或 WITH 参数选择底层存储。

能力矩阵

能力

OLAP 模式(默认)

Lake 模式

说明

底层存储

OLAP 引擎主键表

Iceberg 列存表

—

推荐数据规模

< 100 TB

无上限

Lake 模式基于 LindormDFS,可承载更大规模数据。

数据更新机制

delete vector

MERGE INTO(需重写文件)

delete vector 使 OLAP 模式的行级更新与删除无需重写数据文件。

增量同步延迟(数据新鲜度)

更低

更高

得益于 delete vector,OLAP 模式的更新代价低、增量同步延迟更短。

同步资源开销

更少

更多

单位数据量所需的 Spark 同步资源,OLAP 模式显著更少。

是否依赖 OLAP 资源组

是

否

Lake 模式仅使用 LindormDFS 与计算资源,无需 OLAP 资源组。

湖仓生态(Spark/Presto/Trino 直读)

通过 OLAP 引擎 SQL 接口访问

原生兼容

Lake 模式的 Iceberg 表可被主流开源引擎直接读取。

主键 UPSERT 语义

原生支持

通过 MERGE 实现

用户无感。

删除延迟

约 1 天

无延迟

OLAP 模式对宽表 DELETE 的可见延迟约为 1 天;Lake 模式增量同步后立即生效。

JSON 静态展开(jsonMapping)

支持

支持

—

JSON 动态展开(dynamicJsonColumns)

支持(增量阶段)

支持(增量阶段)

存量数据均不支持动态展开。

Schema 动态感知(dynamicSchema)

支持

支持

通配符列同步仅在 Lake 模式下生效。

ALTER INDEX ADD COLUMNS

支持

支持

—

ALTER INDEX SET 修改列存表名

支持

支持

要求宽表引擎 2.8.5.1 及以上。

索引热重建

支持

支持

步骤一致,详见进阶用法。

使用 OLAP 模式(默认)

不需要任何额外配置,直接使用标准 SQL 即可:

CREATE INDEX orders_idx USING COLUMNAR ON orders(*)
PARTITION BY ENUMERABLE (dt, bucket(128, id))
WITH (
  `lindorm_columnar.user.index.database` = 'my_index_db',
  `lindorm_columnar.user.index.table`    = 'orders_index'
);

若希望显式指定使用的 OLAP 资源组(例如实例中存在多个 OLAP 资源组),配置 sr.resourceGroup 参数:

CREATE INDEX orders_idx USING COLUMNAR ON orders(*)
PARTITION BY ENUMERABLE (dt, bucket(128, id))
WITH (
  `lindorm_columnar.user.index.database`   = 'my_index_db',
  `lindorm_columnar.user.index.table`      = 'orders_index',
  `lindorm_columnar.user.sr.resourceGroup` = 'cg0'
);

OLAP 模式说明

  • __timestamp 元数据列:Lindorm 会在列存表中自动添加一个 __timestamp BIGINT 列,用于 OLAP 引擎主键表判断记录版本(值越大越新)。用户在业务 SQL 中通常无需感知该列。

  • FULL_WAL 自动开启:Lindorm 在为宽表创建 OLAP 模式列存索引时,会自动开启宽表的以下属性,以保证写入的 WAL 携带完整行数据:

  • WAL_EDIT_WITH_FULL_ROW = true

  • FULL_ROW_EDIT_CARRY_LATEST_DATA = true

该操作幂等,会在首次创建 OLAP 模式索引时执行。

  • 写入语义:数据以 APPEND 模式写入 OLAP 引擎,主键表内部按 __timestamp 完成 UPSERT,用户无需感知。

  • 删除延迟:对宽表执行 DELETE 后,删除操作在 OLAP 模式列存索引中的生效延迟约为 1 天。若业务对删除可见性有更强要求,请使用 Lake 模式。

直连 OLAP 引擎查询列存表

OLAP 模式的列存表是 OLAP 资源组内的仓模式列存表(Warehouse Column Store Table),可以直接通过 MySQL 协议连接目标 OLAP 资源组进行查询,不必经过计算引擎 Hint 路由。库表名即 CREATE INDEX 时 WITH 子句中配置的:

  • 数据库名:lindorm_columnar.user.index.database

  • 表名:lindorm_columnar.user.index.table

以上文的 orders_idx 为例,直连查询语句如下:

-- 连接目标 OLAP 资源组后执行
SET CATALOG default_catalog;

SELECT dt, COUNT(*) AS order_cnt, SUM(amount) AS gmv
FROM my_index_db.orders_index
WHERE dt BETWEEN '2026-08-01' AND '2026-08-10'
GROUP BY dt;

OLAP 资源组的连接方式请参见服务访问,仓模式列存表的详细能力请参见仓模式列存表。

使用 Lake 模式

在 WITH 子句显式关闭 OLAP 路由(在租户管理员开放该开关的情况下),或联系 Lindorm 技术支持将实例默认引擎设置为 lake:

CREATE INDEX orders_idx USING COLUMNAR ON orders(*)
PARTITION BY ENUMERABLE (dt, bucket(128, id))
WITH (
  `lindorm_columnar.user.index.database`   = 'my_index_db',
  `lindorm_columnar.user.index.table`      = 'orders_index',
  `lindorm_columnar.user.engine`           = 'lake'
);
说明

已经创建的列存索引不支持在线切换存储模式。若需将存量索引从 Lake 模式切换到 OLAP 模式(反之亦然),建议使用热重建的方案:并存两个索引,等新索引 ACTIVE 后再删除旧索引并切换列存表名。

直连计算引擎查询列存表

Lake 模式的列存表是湖模式列存表(Lake Mode Column Store Table),基于 Apache Iceberg 构建,可以通过 Lindorm 计算引擎(LDPS)Spark SQL 直接查询,也可以在同一实例内被 ETL 资源组或外部 Spark/Flink 引擎读取。库表名同样来源于 CREATE INDEX 时的 WITH 参数:

  • 数据库名:lindorm_columnar.user.index.database

  • 表名:lindorm_columnar.user.index.table

以上文的 orders_idx 为例,直连查询语句如下:

-- 通过 LDPS Spark SQL 执行
SET CATALOG lindorm_columnar;

SELECT dt, COUNT(*) AS order_cnt, SUM(amount) AS gmv
FROM my_index_db.orders_index
WHERE dt BETWEEN '2026-08-01' AND '2026-08-10'
GROUP BY dt;

湖模式列存表的详细能力请参见湖模式列存表。

选型建议

两种存储模式都能覆盖典型的列存索引使用场景,请结合数据规模、更新特征与生态诉求选择。

优先选择 OLAP 模式

推荐用于数据量小于 100 TB、对更新效率与数据新鲜度要求较高的实时分析场景。OLAP 模式采用先进的 delete vector 机制,行级更新与删除都能在无需重写数据文件的前提下高效完成,具有以下优势:

  • 数据更新非常高效:主键 UPSERT / DELETE 以增量方式写入 delete vector 与新版本文件,避免大范围数据重写。

  • 数据新鲜度高:更新代价低,增量同步延迟更短,写入后短时间内即可被 OLAP 查询命中。

  • 同步资源占用少:单位数据量所需的 Spark 同步资源显著低于 Lake 模式,可以以更少的计算资源承载相同的写入吞吐。

优先选择 Lake 模式

推荐用于湖仓生态深度集成或不希望依赖 OLAP 资源组的场景。Lake 模式的列存表是标准 Iceberg 表,具有以下优势:

  • 可用 Spark 进行 ELT 查询分析:可直接在 Lindorm 计算引擎(LDPS)中用 Spark SQL 读取、加工列存索引,便于承接 ETL / ELT 数据流。

  • 开源生态兼容性高:Iceberg 表可被 Spark、Presto、Trino 等主流开源引擎读取,方便跨引擎共用同一份数据。

  • 不依赖 OLAP 资源组:仅使用 LindormDFS 与计算资源,无需额外开通与维护 OLAP 引擎资源组。

如需帮助评估选型,请联系 Lindorm 技术支持(钉钉号:s0s3eg3)。