SQL查詢最佳化

更新時間:
Copy as MD

Table Store 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

統計彙總