快速入门

更新时间:
复制 MD 格式

列存索引(Columnar Index)是云原生多模数据库 Lindorm 宽表引擎提供的列式二级索引。通过为宽表创建列存索引,海量数据可以按列式格式重新组织,从而在聚合、扫描、多列投影等 OLAP 分析场景下显著提升查询吞吐。列存索引与宽表数据自动保持同步,用户在业务侧无需变更主表写入方式,即可通过标准 SQL 完成分析查询。

本节介绍列存索引的应用场景、核心能力与使用限制,并通过一个完整示例,帮助您在 5 分钟内为宽表创建列存索引并完成一次分析查询。示例默认使用 OLAP 模式(推荐,也是新版 Lindorm 实例的默认行为)。若您希望使用 Lake 模式,请参见存储模式

应用场景

  • 车联网 / 物联网:设备指标聚合、时序统计分析。

  • 电商与营销:订单、行为、用户画像的多维分析。

  • 物流与供应链:订单、运单、履约状态的报表查询。

  • 金融风控:交易明细的实时聚合与关联分析。

核心能力

  • OLAP 查询加速:列存索引针对聚合、过滤、扫描等 OLAP 操作深度优化,查询过程中仅读取涉及的列,避免行式存储的全行扫描开销。

  • 无缝兼容宽表 SQL 语法:通过标准 CREATE INDEX ... USING COLUMNAR 语法即可创建索引;查询时在 SELECT 语句中携带 Hint,即可自动路由至计算引擎并命中列存索引,无需改造业务代码。

  • 灵活的数据分区策略:支持普通分区表达式 + Bucket 分区表达式组合,普通分区支持时间/日期等业务字段的表达式计算,Bucket 分区可对高基数字段进行 Hash 分片,帮助您在数据量与查询效率之间取得平衡。

  • Schema 动态感知:可自动感知宽表列的新增、动态列、通配符列的变更,并同步至列存索引,无需重建索引即可扩展分析字段。

前提条件

  • 已购买并激活云原生多模数据库 Lindorm 实例,且宽表引擎版本为 2.5.0 及以上。查看或升级版本请参见宽表引擎版本说明升级小版本

  • 已开通计算引擎,具体操作请参见服务开通

  • 已开通至少一个 OLAP 资源组,并将其设置为默认资源组。OLAP 资源组的开通与默认资源组的设置请参见开通与管理

  • 已在宽表引擎中创建目标宽表并写入示例数据。

使用限制

  • 列存索引不支持同步构建方式:索引数据以异步同步的方式构建,创建索引后需等待索引状态变为 ACTIVE 才能用于查询。

  • 列存索引首次构建耗时约为 15 分钟。若后台索引构建任务较多或宽表数据量较大,构建耗时可能更长。

  • 主表若开启了冷热分离,请关注冷存储的限流情况,防止冷存储回查导致索引构建变慢并引发主表写入反压。

  • 宽表数据因 TTL 过期被清除后,列存索引数据不会自动清除,需要在业务侧显式处理。

开通步骤

  1. 登录Lindorm管理控制台

  2. 在页面左上角,选择实例所属的地域。

  3. 实例列表页,单击目标实例ID或者目标实例所在行操作列的管理

  4. 在左侧导航栏,选择宽表引擎

  5. 单击列存索引页签,并单击立即开通

  6. 在弹出的对话框中单击确定,等待开通完成。

开通完成后,即可通过标准 SQL CREATE INDEX ... USING COLUMNAR 为宽表创建列存索引。

场景介绍

假设需要对订单明细表 orders 进行高效并行数据分析,表结构如下:

+------------+-------------+---------+----------------+
| TABLE_NAME | COLUMN_NAME |  TYPE   | IS_PRIMARY_KEY |
+------------+-------------+---------+----------------+
| orders     | id          | BIGINT  | true           |
| orders     | dt          | VARCHAR | true           |
| orders     | amount      | DECIMAL | false          |
| orders     | status      | VARCHAR | false          |
+------------+-------------+---------+----------------+
  • 主键 id 是订单标识,基数较大,适合作为 Bucket 分区键。

  • 主键 dt 是订单日期(业务上通常按天分析),可直接作为普通分区键。

操作示例

  1. 创建列存索引:

    orders 的全部字段创建列存索引,按日期分区,Bucket 数量设置为 128:

    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'
    );
    说明

    上述 SQL 在 OLAP 模式与 Lake 模式下语法完全一致。系统会根据实例默认引擎自动选择底层实现。您也可以通过 WITH 参数显式切换到 Lake 模式或指定 OLAP 引擎资源组,详见存储模式

  2. 查看索引状态:

    SHOW INDEX FROM orders;

    返回示例(关键字段):

    +-------------+------------+------------+-------------+---------------------------------+------------+
    | TABLE_SCHEMA| DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_PROGRESS                  | INDEX_TYPE |
    +-------------+------------+------------+-------------+---------------------------------+------------+
    | default     | orders     | orders_idx | ACTIVE      | 2026-08-10 18:59:20.652 +0800   | COLUMNAR   |
    +-------------+------------+------------+-------------+---------------------------------+------------+
    • INDEX_STATEBUILDING 转为 ACTIVE 后,索引即可用于查询。

    • INDEX_PROGRESS 表示增量同步位点:位点之前的宽表数据已完全同步至列存索引;BUILDING 阶段该字段为空,进入 ACTIVE 后会随增量同步持续推进。

    SHOW INDEX 完整字段说明及查询示例请参见基础用法 — 查看列存索引

  3. 使用列存索引进行数据查询:

    在 SELECT 语句中携带 Hint,即可将查询路由至计算引擎并命中列存索引:

    SELECT /*+ _use_ldps_(cg0), _columnar_index_ */
           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;

    其中 cg0 为查询所使用的计算资源组名。您可以将其替换为实际的资源组名。

计费说明

列存索引本身不收取额外的功能费,创建后会产生以下费用:

  • 列存索引数据的存储费用

  • 主表与列存索引之间数据同步实际使用的 CU 费用

具体计费项与计费规则请以阿里云官方定价页为准。

下一步

  • 掌握基础语法与分区策略 → 基础用法

  • 了解 JSON 展开、Schema 动态感知、热重建等能力 → 进阶用法

  • 了解两种存储模式的差异,以及如何直连查询列存表 → 存储模式

  • 遇到问题时查阅 → 常见问题