存储模式

更新时间:
复制 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 INDEXWITH 子句中配置的:

  • 数据库名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)。