SQL查詢最佳化
Table Store 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 |