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 列がデータテーブルに作成されたサーチインデックスに含まれている場合、Tablestore はデータクエリにサーチインデックスを自動的に選択します。GROUP BY 句と集計関数を組み合わせた SQL 文がサーチインデックスの Search API 操作の集計機能と一致する場合、Tablestore は演算子も識別し、演算子をサーチインデックスにプッシュダウンします。演算子のプッシュダウンの詳細については、「演算のプッシュダウン」をご参照ください。
セカンダリインデックスの自動選択:セカンダリインデックスに、WHERE 句で指定されたプライマリキー列がデータテーブルよりも多く含まれており、セカンダリインデックスに SQL 文に関連するすべての列が含まれている場合、Tablestore は、データクエリにセカンダリインデックスを自動的に選択します。 WHERE 句のプライマリキー条件は、左端一致の原則に従います。
たとえば、データテーブルのプライマリキー列が a と b で、データテーブルに作成されたセカンダリインデックスのプライマリキー列が c、a、および b であるとします。クエリ条件が
c = 1 and a > 1の場合、セカンダリインデックスには条件で指定されたプライマリキー列が 2 つ含まれており、データテーブルには条件で指定されたプライマリキー列が 1 つ含まれています。この場合、Tablestore はデータクエリにセカンダリインデックスを自動的に選択します。データテーブルまたはセカンダリインデックスの自動選択:Tablestore は、SQL エンジンのコストベースの最適化 (CBO) ロジックと、データクエリ用の SQL 文のパターンに基づいて、データテーブルまたはセカンダリインデックスを選択します。
手動選択
use index ヒントを使用して、データクエリ用のインデックスを明示的に指定するか、インデックスに作成されたマッピングテーブルをデータクエリに使用するように明示的に指定できます。
この例では、sampletable という名前のデータテーブル、sampletable_search_index という名前のサーチインデックス、およびデータテーブルに作成された sampletable_secondary_index という名前のセカンダリインデックスを使用して、手動選択ポリシーで必要な操作について説明します。
アクセスするデータテーブルを明示的に指定する
次の SQL 文の例は、アクセスするデータテーブルを明示的に指定する方法を示しています。
SELECT * FROM sampletable use index();アクセスするサーチインデックスまたはセカンダリインデックスを明示的に指定する
説明インデックスに SQL クエリに関連する列が含まれていない場合、SQL エンジンはデータテーブルからデータを自動的にクエリして必要なデータを取得します。
次の SQL 文の例は、アクセスするインデックスを明示的に指定する方法を示しています。
SELECT * FROM sampletable use index(sampletable_search_index); --アクセスするサーチインデックスを明示的に指定します。 SELECT * FROM sampletable use index(sampletable_secondary_index); --アクセスするセカンダリインデックスを明示的に指定します。
セカンダリインデックスに作成されたマッピングテーブルを使用する
セカンダリインデックスを使用してデータをクエリする場合、次の手順を実行して、セカンダリインデックスに作成されたマッピングテーブルをデータクエリに使用できます。
セカンダリインデックスに作成されたマッピングテーブルを使用してデータをクエリする場合、セカンダリインデックスに含まれるデータ列のみをクエリできます。
CREATE TABLE 文を実行して、セカンダリインデックスのマッピングテーブルを作成します。詳細については、「テーブルにマッピングテーブルを作成する」をご参照ください。
SELECT 文を実行して、セカンダリインデックスに作成されたマッピングテーブルを使用してデータをクエリします。詳細については、「データをクエリする」をご参照ください。
サーチインデックスに作成されたマッピングテーブルを使用する
サーチインデックスを使用してデータをクエリする場合、次の手順を実行して、サーチインデックスに作成されたマッピングテーブルをデータクエリに使用できます。
サーチインデックスに作成されたマッピングテーブルを使用してデータをクエリする場合、サーチインデックスに含まれるデータ列のみをクエリできます。
CREATE TABLE 文を実行して、サーチインデックスのマッピングテーブルを作成します。詳細については、「テーブルにマッピングテーブルを作成する」をご参照ください。
SELECT 文を実行して、サーチインデックスに作成されたマッピングテーブルを使用してデータをクエリします。詳細については、「データをクエリする」をご参照ください。
付録:サーチインデックスの機能と SQL 式のマッピング
サーチインデックスは、SQL 式と同じ機能を提供します。次の表に、サーチインデックスの機能と SQL 式のマッピングを示します。
SQL 式 | 例 | サーチインデックスの機能 |
述語なし | 該当なし | |
= |
| |
> | 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 クエリを高速化する場合は、サーチインデックスに基づいて機能を使用できます。これらの機能には、全文検索、サーチインデックスの配列型、サーチインデックスのネスト型、およびサーチインデックスの仮想カラム が含まれます。