Tablestore作為海量結構化巨量資料儲存,支援不同的索引結構,便於不同情境下進行查詢分析加速使用。本文介紹在資料表上存在多元索引和二級索引時如何選擇SQL查詢所使用的索引。
使用資料表映射表
當資料表上存在二級索引和多元索引時,使用SQL查詢會涉及到多個索引的選擇,索引選擇策略包括自動選擇策略和手動選擇策略。
請確保已在資料表上建立映射關係。具體操作,請參見建立表的映射關係。
自動選擇策略
使用資料表的映射表查詢資料時,Tablestore會自動選擇資料表、二級索引或多元索引進行資料查詢。
如果建立表的映射關係時設定了執行的查詢結果要滿足強一致性或者不允許通過犧牲彙總操作的精度提升查詢效能,則Tablestore不會自動選擇多元索引進行資料查詢。
當二級索引和多元索引同時包含SQL查詢涉及的所有列時,Tablestore會優先選擇多元索引進行資料查詢。
自動選擇策略由上到下依次執行。具體執行流程如下:
自動選擇多元索引:如果WHERE子句中的所有過濾列、彙總計算和排序涉及的列均包含在同一個多元索引中,則Tablestore會自動選擇該多元索引進行資料查詢。
例如
SELECT A,B,C FROM sampletable WHERE A=XXX and D = YY;
語句,如果A、B、C、D列均在sampletable表上的同一個多元索引中,則會自動選擇到多元索引進行查詢。此外,當Groupby、彙總函式等組合使用時,如果符合多元索引Search介面的統計彙總能力,則Tablestore也會進行識別並下推運算元,關於下推運算元的更多資訊,請參見計算下推。
自動選擇二級索引:如果二級索引能比資料表命中更多的WHERE子句中的主鍵條件(遵循最左匹配原則),且覆蓋了SQL查詢涉及的所有列,則Tablestore會自動選擇該二級索引進行資料查詢。
例如資料表主鍵為a、b,資料表上某個二級索引的主鍵為c、a、b,當查詢條件為
c = 1 and a > 1
時,二級索引命中兩個主鍵列,資料表命中一個主鍵列,則會自動選擇到二級索引進行查詢。自動選擇資料表或二級索引:根據SQL引擎內部的CBO邏輯從資料表或二級索引間進行選擇,此時的選擇結果與具體SQL的Pattern有關,SQL引擎會盡量選擇代價較低的索引來執行查詢。
手動選擇策略
當要在查詢資料時穩定地選擇某一個索引時,您可以通過use index
文法顯式指定索引或者直接使用索引的映射表。
此處以資料表名為sampletable,多元索引名為sampletable_search_index,二級索引名為sampletable_secondary_index為例介紹手動選擇策略的操作。
顯式指定訪問資料表
在SQL語句中顯式指定訪問資料表。SQL樣本如下:
SELECT * FROM sampletable use index();
顯式指定訪問多元索引或二級索引
說明如果索引中不包含SQL查詢相關的列,則SQL引擎會自動反查資料表以擷取所需資料。
在SQL語句中顯式指定要訪問的索引。SQL樣本如下:
SELECT * FROM sampletable use index(sampletable_search_index); --顯式訪問多元索引 SELECT * FROM sampletable use index(sampletable_secondary_index); --顯式訪問二級索引
使用二級索引映射表
當要通過指定的二級索引查詢資料時,您可以直接使用二級索引映射關係進行查詢。具體操作如下:
使用索引映射表查詢資料時,只能查詢索引中包含的資料列。
使用多元索引映射表
當要通過指定的多元索引查詢資料時,您可以直接使用多元索引映射關係進行查詢。具體操作如下:
使用索引映射表查詢資料時,只能查詢索引中包含的資料列。
使用CREATE TABLE語句建立多元索引的映射關係。具體操作,請參見建立多元索引的映射關係。
使用SELECT語句通過多元索引映射表查詢資料。具體操作,請參見查詢資料。
附錄:多元索引中功能與SQL運算式的映射
多元索引能夠實現與SQL運算式相同的功能,具體功能映射資訊請參見下表。
SQL運算式 | 樣本 | 多元素引中功能 |
without predicate | 不涉及 | |
= |
| |
> | a > 1 | |
>= | a >= 2 | |
< | a < 5 | |
<= | a <= 10 | |
is null | a is null | |
is not null | a is not null | |
and | a = 1 and b = "hello world" | |
or | a > 1 or b = 2 | |
not | not a = 1 | |
!= | a !=1 | |
like | a like "%s%" | |
in | a in (1,2,3) | |
text_match | text_match(a, "tablestore cool") | |
text_match_phrase | text_match_phrase(a, "tablestore cool") | |
array_extract | array_extract(col_long) | |
nested_query | nested_query(`tags.tagName` = 'tag1' AND `tags.score` = 0.2) | |
order by | nested_query col_long | |
limit | limit 10 | |
min() | min(col_long) | |
max() | max(col_long) | |
sum() | sum(col_long) | |
avg() | avg(col_long) | |
count() | count(col_long) | |
count(distinct) | count(distinct col_long) | |
any_value() | any_value(col_long) | |
group by | group by col_long |
相關文檔
使用多元索引加速SQL查詢資料時,您可以通過多元索引實現全文檢索索引、多元索引數群組類型、多元索引巢狀型別、多元索引虛擬列等功能。