全部产品
Search
文档中心

云原生数据库 PolarDB:查询数据与分析加速

更新时间:Nov 04, 2026

Lance 外表查询无需预先导入数据或创建列存索引。查询支持行式执行(MySQL 原生执行器),也可使用 IMCI 加速执行。需要 IMCI 加速时,可选择单节点 IMCI 或 MPP 并行执行。

执行路径的选择参考如下:

  • 行式执行:适用于过滤、JOIN、聚合、排序等查询场景。大数据量关联分析可能耗时较长,强烈建议使用 IMCI 加速。

  • 单节点 IMCI:禁用 MPP 并行执行,查询通过 IMCI 在单个节点执行。

  • MPP 并行执行:跨节点并行执行,面向海量数据分析场景,使用前需提交工单开通集群的 IMCI MPP 功能。

查询处理流程如下所示: lance-query-mechanism

适用范围

执行查询前,需满足以下通用前提:

  • 已满足使用前提与功能限制中的要求。

  • 账号具有待查询表的 SELECT 权限。

  • 已创建待查询外表。

  • 如需在读写节点(RW)读取,已开启loose_lance_allow_reads_on_rw。

不同执行路径还需满足以下专属前提:

  • IMCI 加速查询(单节点 IMCI、MPP 并行执行):节点已启用 IMCI。

  • MPP 并行执行:

    • 请提交工单,联系我们为您开通集群的 IMCI MPP 功能并完成配置。

    • 所有 Worker 节点均能访问 OSS,并具有相应访问权限。

    • 使用 REST Namespace 时,所有 Worker 节点均能访问 Namespace 服务并通过身份认证。

行式执行

行式执行适用于过滤、JOIN、聚合、排序等查询场景,支持与当前节点可访问的 InnoDB、X-Engine 行存表及 MyISAM 表 JOIN,JOIN 列类型需兼容。

说明

本文示例中的 example_* 为占位名称,SET SESSION 仅影响当前连接,未包含 USE example_db; 的示例默认已选中目标数据库。

以下示例先关闭列式执行引擎,再执行查询,最后读取 Last_stmt_use_imci 会话状态变量:若返回 FALSE,则查询为行式执行。

SET SESSION use_imci_engine = OFF;
SELECT SUM(example_id) FROM example_table;
SHOW SESSION STATUS LIKE 'Last_stmt_use_imci';
重要

采用行式执行进行大数据量关联分析时,查询可能耗时较长,建议在满足条件时使用 IMCI 加速。涉及本地 InnoDB 表时,应为其添加覆盖查询所需列的 IMCI 索引,并确认索引已构建完成且可读。具体操作请参见列存索引的列存索引使用说明。

使用 IMCI 加速查询

以下示例会调整 use_imci_engine 和 imci_plan_use_mpp 参数:

  • use_imci_engine 控制是否使用 IMCI,取值行为如下:

    取值

    行为

    OFF

    只使用行式执行。

    ON

    优先尝试 IMCI,在允许回退时使用行式执行。

    FORCED

    强制使用 IMCI,无法执行时返回错误。

  • imci_plan_use_mpp 控制是否采用 MPP。OFF 禁用 MPP 并行执行,查询通过单节点 IMCI 执行。NO_FALLBACK 要求查询不回退单节点 IMCI 执行。

    重要

    与本地表关联时,若存在无法使用 IMCI 的表(例如 InnoDB 表没有可用的 IMCI 索引,或索引未覆盖查询所需列),use_imci_engine=ON 时整条查询(包括 Lance 外表读取)会回退到行式执行。use_imci_engine=FORCED 时则报错。

单节点执行

以下示例设置 use_imci_engine=FORCED,强制查询通过 IMCI 执行。设置 imci_plan_use_mpp=OFF,禁用 MPP 并行执行。接下来执行查询,再读取 Last_stmt_use_imci 会话状态变量:若返回 TRUE,则查询使用 IMCI 加速。结合 imci_plan_use_mpp=OFF,可确定为单节点 IMCI 执行。

USE example_db;

SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = OFF;
SELECT SUM(example_id) FROM example_table;
SHOW SESSION STATUS LIKE 'Last_stmt_use_imci';

MPP 并行执行

说明

MPP 的适用场景和使用说明,请参见使用多机 MPP 对海量数据分析提速。完成开通后,连接对应的 MPP 执行组执行查询。

以下示例设置 use_imci_engine=FORCED,要求查询通过 IMCI 执行,无法使用时会报错。设置 imci_plan_use_mpp=NO_FALLBACK,要求查询不回退单节点 IMCI 执行。接下来使用 EXPLAIN ANALYZE 验证查询的实际执行方式:该命令会实际执行查询并返回执行统计,正常查询时去掉 EXPLAIN ANALYZE 前缀即可。之后读取 Last_stmt_use_imci 会话状态变量。

USE example_db;

SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = NO_FALLBACK;

EXPLAIN ANALYZE
SELECT SUM(example_id) FROM example_table;
SHOW SESSION STATUS LIKE 'Last_stmt_use_imci';

执行完成后,从以下两方面确认执行方式:

  • 确认使用 IMCI:查询成功后,读取 Last_stmt_use_imci 会话状态变量,返回 TRUE 表示本次查询使用了 IMCI,但不一定跨节点 MPP 并行执行。imci_plan_use_mpp=NO_FALLBACK 是 MPP 执行控制参数,不能替代 EXPLAIN ANALYZE 实际验证。

  • 确认 MPP 跨节点执行:检查本次 EXPLAIN ANALYZE 成功返回的结果,确认包含 A-Rows、Execution Time(s) 等实际执行统计,以及 Consume 和 Exchange 算子。在这些算子的 Extra Info 中,将 Producers(生产节点)和 Consumers(消费节点)列出的节点 ID 合并去重。若至少包含两个不同 ID,则表示本次查询已采用跨节点 MPP 执行。

下推能力

Lance 外表支持将过滤条件和符合要求的 LIMIT/OFFSET 下推到 Lance 读取层。各执行路径的下推能力支持范围如下:

执行路径

过滤下推

LIMIT/OFFSET 下推

行式执行

支持

不支持

单节点 IMCI

支持

满足条件时支持

MPP 并行执行

支持

不支持

以下示例均使用单节点 IMCI,可通过 EXPLAIN ANALYZE 判断是否实际发生下推。

过滤下推

lance_enable_filter_pushdown 控制过滤下推,默认开启。

SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = OFF;
SET SESSION lance_enable_filter_pushdown = ON;

EXPLAIN ANALYZE
SELECT example_id FROM example_table
WHERE example_id BETWEEN 1 AND 5;

执行计划中出现 Lance Filter Pushed Down: true,表示本次查询有过滤条件下推到 Lance。该标记不代表全部过滤条件都已下推。

LIMIT/OFFSET 下推

单节点 IMCI 的查询在满足条件时,可以将 LIMIT/OFFSET 下推到 Lance。该优化由 imci_optimizer_switch 中的 lance_limit_pushdown 控制:

  • 有过滤条件时:必须开启 lance_enable_filter_pushdown,且先于 LIMIT/OFFSET 执行的全部过滤条件都能完整下推到 Lance。仅能部分下推或仍需在执行层完成过滤时,不下推 LIMIT/OFFSET。

  • 没有过滤条件时:LIMIT/OFFSET 可独立下推,不依赖过滤下推开关。即使 lance_enable_filter_pushdown=OFF,也可生效。

此外,LIMIT/OFFSET 必须直接作用于扫描和过滤操作,不能穿过排序、关联或聚合等操作,执行计划中也不能包含 Exchange 算子。是否实际下推,以 EXPLAIN ANALYZE 中的 Lance Limit Pushed Down: true 为准。判断是否跨节点 MPP 执行,仍需按前文方法核对节点 ID。

SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = OFF;
SET SESSION imci_optimizer_switch = 'lance_limit_pushdown=on';

EXPLAIN ANALYZE
SELECT example_id FROM example_table
LIMIT 3 OFFSET 1;

执行计划中出现以下信息,表示 LIMIT/OFFSET 已下推:

Lance Limit Pushed Down: true
Lance Limit: 3
Lance Offset: 1

按 _rowid 读取

_rowid 是 Lance 提供的行地址。按 _rowid 读取需在外表定义中显式声明,自动发现列不会添加该列。以下示例在可读取 Lance 的 RW 节点执行,先重建显式声明 _rowid 列的 example_table 外表映射,再按 _rowid 读取 example_id。

DROP FOREIGN TABLE IF EXISTS example_table;

CREATE FOREIGN TABLE example_table (
  example_id BIGINT NOT NULL,
  _rowid BIGINT UNSIGNED NOT NULL
) ENGINE=LANCE
CONNECTION='server://example_oss/example_table.lance';

SELECT example_id FROM example_table WHERE _rowid IN (1, 2) ORDER BY example_id;

数据一致性与更新可见性

每条查询执行期间,参与查询的各节点读取同一 Lance 外表的固定数据集地址、版本和表结构,不随写入的新版本而变化。MPP 并行执行时,各 MPP Worker 同样使用该表的同一快照和表结构,确保各节点读取一致。该保证以单条语句、单张表为范围,不提供事务级或多表全局快照。后续查询对数据更新的可见性及表结构变更的处理,请参见外表映射维护。