云原生多模数据库 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 静态展开( | 支持 | 支持 | — |
JSON 动态展开( | 支持(增量阶段) | 支持(增量阶段) | 存量数据均不支持动态展开。 |
Schema 动态感知( | 支持 | 支持 | 通配符列同步仅在 Lake 模式下生效。 |
| 支持 | 支持 | — |
| 支持 | 支持 | 要求宽表引擎 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 会在列存表中自动添加一个__timestampBIGINT 列,用于 OLAP 引擎主键表判断记录版本(值越大越新)。用户在业务 SQL 中通常无需感知该列。FULL_WAL 自动开启:Lindorm 在为宽表创建 OLAP 模式列存索引时,会自动开启宽表的以下属性,以保证写入的 WAL 携带完整行数据:
WAL_EDIT_WITH_FULL_ROW = trueFULL_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;使用 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)。