表格存储 SQL 引擎通过索引选择和计算下推两种机制优化查询效率。索引选择决定数据从哪里读取,计算下推决定计算在哪里执行。
索引选择
当数据表上存在二级索引或多元索引时,SQL 引擎在执行查询前会选择最优的数据读取路径。选择方式分为自动选择和手动指定。
使用查询优化前,请确保已创建数据表映射关系,详见DDL 操作。如需使用多元索引加速查询,还需创建多元索引及其映射关系。
自动选择规则
使用数据表映射表查询时,SQL 引擎按以下优先级自动选择索引:
优先级 | 选择目标 | 生效条件 |
1 | 多元索引 | WHERE 过滤列、聚合列、排序列均包含在同一个多元索引中。 示例: |
2 | 二级索引 | 二级索引能比数据表命中更多 WHERE 子句中的主键前缀条件(最左匹配原则),且覆盖查询涉及的所有列。 示例:数据表主键为 a、b,二级索引主键为 c、a、b。当 |
3 | CBO 决策 | 上述规则均不满足时,SQL 引擎根据内部 CBO(Cost-Based Optimizer)逻辑从数据表和二级索引中选择代价较低者。 |
如果映射关系设置了强一致性要求或禁止牺牲聚合精度,则系统不会自动选择多元索引。
当二级索引和多元索引同时覆盖查询所需的所有列时,系统优先选择多元索引。
手动指定索引
如需固定使用某个索引,可通过以下两种方式手动指定:
use index 语法
在 SELECT 语句中显式指定索引。
-- 强制走数据表(跳过所有索引)
SELECT * FROM sampletable use index();
-- 指定走多元索引
SELECT * FROM sampletable use index(sampletable_search_index);
-- 指定走二级索引
SELECT * FROM sampletable use index(sampletable_secondary_index);如果指定的索引不包含查询涉及的列,SQL 引擎会自动反查数据表获取所需数据。
索引映射表
直接查询二级索引或多元索引的映射表。
-- 通过多元索引映射表查询(只能查索引中包含的列)
SELECT col_a, col_b FROM search_index_mapping WHERE col_a > 10;使用索引映射表查询时,只能查询索引中包含的数据列。
选择建议
场景 | 建议 |
包含聚合、排序、全文检索 | 使用自动选择(默认),确保多元索引覆盖所需列。系统自动命中多元索引并下推算子。 |
简单等值/范围过滤,数据强一致性要求 | 使用二级索引。二级索引支持强一致读,适合对数据实时性要求高的场景。 |
自动选择结果不符合预期 | 通过 |
只需查询索引中已有的列 | 直接使用索引映射表查询,避免反查数据表的额外开销。 |
计算下推
SQL 引擎支持将部分计算算子下推到多元索引层执行,减少需要在 SQL 引擎层处理的数据量。
生效条件
计算下推生效的前提:多元索引必须覆盖 SQL 语句中所有涉及的数据列,包括 SELECT 列、WHERE 列、ORDER BY 列和 GROUP BY 列。任一列不在多元索引中,SQL 引擎回退为全表扫描。
-- 表有 a、b、c、d 四列,多元索引包含 a、b、c
-- d 不在多元索引中 → 全表扫描,不下推
SELECT a, b, c, d FROM exampletable;
-- 所有列在多元索引中 → 通过多元索引读取,支持下推
SELECT a, b, c FROM exampletable;支持下推的算子
算子类型 | 支持下推 | 下推条件 |
逻辑运算符 | AND、OR | NOT 不支持下推。 |
关系运算符 | =、!=、<、<=、>、>=、BETWEEN...AND | 仅支持列与常数比较。列与列比较不支持下推(多元索引对每列独立建索引,无法在索引层解析跨列比较)。 |
聚合函数 | MIN、MAX、COUNT、AVG、SUM、ANY_VALUE、COUNT(DISTINCT)、GROUP BY | 参数必须是数据列,不能是表达式。COUNT(*) 支持下推。 |
排序与分页 | ORDER BY col LIMIT n | ORDER BY 参数必须是数据列,按表达式排序不支持下推。 |
向量函数 | VECTOR_QUERY_FLOAT32 | WHERE 子句中其他所有表达式都必须满足下推条件,整个 WHERE 才能下推;任一不满足则查询无法执行。 |
常见阻止下推的写法
阻止下推的写法 | 修正写法 | 原因 |
| | a 为 BIGINT,类型不匹配触发隐式 CAST |
| | 聚合参数为表达式 |
| | 分组参数为表达式 |
| 无等效改写,需应用层过滤 | 列与列比较 |
| | 排序参数为表达式 |
SQL 表达式与多元索引功能映射
从多元索引 SDK 迁移到 SQL 查询时,参考下表了解 SQL 表达式与多元索引原生查询功能的对应关系。
SQL 表达式 | 示例 | 多元索引功能 |
无 WHERE 条件 | SELECT * FROM t | |
= | a = 1 | |
>、>=、<、<= | a > 1 | |
IS NULL / IS NOT NULL | a IS NULL | |
AND / OR / NOT / != | a = 1 AND b = 2 | |
LIKE | a LIKE "%s%" | |
IN | a IN (1,2,3) | |
TEXT_MATCH | TEXT_MATCH(a, "hello") | |
TEXT_MATCH_PHRASE | TEXT_MATCH_PHRASE(a, "hello world") | |
ARRAY_EXTRACT | ARRAY_EXTRACT(col) | |
NESTED_QUERY | NESTED_QUERY(expr) | |
ORDER BY / LIMIT | ORDER BY a LIMIT 10 | |
聚合函数 / GROUP BY | SUM(col) / GROUP BY col |