SQL查询优化

更新时间:
复制为 MD 格式

表格存储 SQL 引擎通过索引选择和计算下推两种机制优化查询效率。索引选择决定数据从哪里读取,计算下推决定计算在哪里执行。

索引选择

当数据表上存在二级索引多元索引时,SQL 引擎在执行查询前会选择最优的数据读取路径。选择方式分为自动选择和手动指定。

说明

使用查询优化前,请确保已创建数据表映射关系,详见DDL 操作。如需使用多元索引加速查询,还需创建多元索引及其映射关系。

自动选择规则

使用数据表映射表查询时,SQL 引擎按以下优先级自动选择索引:

优先级

选择目标

生效条件

1

多元索引

WHERE 过滤列、聚合列、排序列均包含在同一个多元索引中。

示例:SELECT A,B,C FROM t WHERE A=1 AND D=2; — 若 A、B、C、D 均在同一多元索引中,则自动命中。

2

二级索引

二级索引能比数据表命中更多 WHERE 子句中的主键前缀条件(最左匹配原则),且覆盖查询涉及的所有列。

示例:数据表主键为 a、b,二级索引主键为 c、a、b。当 WHERE c = 1 AND a > 1 时,二级索引命中 2 列 > 数据表命中 1 列。

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

使用索引映射表查询时,只能查询索引中包含的数据列。

选择建议

场景

建议

包含聚合、排序、全文检索

使用自动选择(默认),确保多元索引覆盖所需列。系统自动命中多元索引并下推算子。

简单等值/范围过滤,数据强一致性要求

使用二级索引。二级索引支持强一致读,适合对数据实时性要求高的场景。

自动选择结果不符合预期

通过 use index(index_name) 手动指定。适合性能调优或绕过 CBO 误判。

只需查询索引中已有的列

直接使用索引映射表查询,避免反查数据表的额外开销。

计算下推

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 才能下推;任一不满足则查询无法执行。

常见阻止下推的写法

阻止下推的写法

修正写法

原因

WHERE a = '123'
WHERE a = 123

a 为 BIGINT,类型不匹配触发隐式 CAST

SELECT SUM(a+b)
SELECT SUM(a)+SUM(b)

聚合参数为表达式

GROUP BY a+1
GROUP BY a

分组参数为表达式

WHERE a > b

无等效改写,需应用层过滤

列与列比较

ORDER BY a+1 LIMIT 10
ORDER BY a LIMIT 10

排序参数为表达式

SQL 表达式与多元索引功能映射

从多元索引 SDK 迁移到 SQL 查询时,参考下表了解 SQL 表达式与多元索引原生查询功能的对应关系。

SQL 表达式

示例

多元索引功能

无 WHERE 条件

SELECT * FROM t

全匹配查询(MatchAllQuery)

=

a = 1

精确查询(TermQuery)

>、>=、<、<=

a > 1

范围查询(RangeQuery)

IS NULL / IS NOT NULL

a IS NULL

列存在性查询(ExistsQuery)

AND / OR / NOT / !=

a = 1 AND b = 2

多条件组合查询(BoolQuery)

LIKE

a LIKE "%s%"

通配符查询(WildcardQuery)

IN

a IN (1,2,3)

多词精确查询(TermsQuery)

TEXT_MATCH

TEXT_MATCH(a, "hello")

匹配查询(MatchQuery)

TEXT_MATCH_PHRASE

TEXT_MATCH_PHRASE(a, "hello world")

短语匹配查询(MatchPhraseQuery)

ARRAY_EXTRACT

ARRAY_EXTRACT(col)

数组和嵌套类型

NESTED_QUERY

NESTED_QUERY(expr)

嵌套类型查询(NestedQuery)

ORDER BY / LIMIT

ORDER BY a LIMIT 10

排序和翻页

聚合函数 / GROUP BY

SUM(col) / GROUP BY col

统计聚合