すべてのプロダクト
Search
ドキュメントセンター

Tablestore:インデックス選択ポリシー

最終更新日:Feb 15, 2025

Tablestore は、大量の構造化データを格納でき、さまざまなシナリオでクエリと分析を高速化するためのさまざまな種類のインデックススキーマをサポートしています。このトピックでは、データテーブルにセカンダリインデックスとサーチインデックスが作成されている場合に、SQL 文を実行してデータをクエリするために使用されるインデックスを選択する方法について説明します。

説明

セカンダリインデックスとサーチインデックスの詳細については、「セカンダリインデックス」および「サーチインデックス」をご参照ください。

データテーブルに作成されたマッピングテーブルを使用する

データテーブルにセカンダリインデックスとサーチインデックスが作成されている場合、SQL 文を実行してデータをクエリする際に、インデックスを指定するためにインデックス選択ポリシーが必要です。インデックス選択ポリシーは、自動選択または手動選択が可能です。

重要

データテーブルにマッピングテーブルが作成されていることを確認してください。詳細については、「テーブルにマッピングテーブルを作成する」をご参照ください。

自動選択

データテーブルに作成されたマッピングテーブルを使用してデータをクエリする場合、Tablestore は、データクエリのデータテーブル、セカンダリインデックス、またはサーチインデックスを自動的に選択します。

重要
  • クエリ対象のデータテーブルにマッピングテーブルを作成する際に、クエリ結果を強整合性モードにする必要があること、または集約操作の精度を損なうことでクエリのパフォーマンスを向上させることができないことを指定した場合、Tablestore は、データクエリにサーチインデックスを自動的に選択しません。

  • セカンダリインデックスとサーチインデックスに SQL 文で指定された列が含まれている場合、Tablestore は、データクエリにサーチインデックスを自動的に選択します。

自動選択ポリシーは、次の手順に基づいて実行されます。

  1. サーチインデックスの自動選択: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 は演算子も識別し、演算子をサーチインデックスにプッシュダウンします。演算子のプッシュダウンの詳細については、「演算のプッシュダウン」をご参照ください。

  2. セカンダリインデックスの自動選択:セカンダリインデックスに、WHERE 句で指定されたプライマリキー列がデータテーブルよりも多く含まれており、セカンダリインデックスに SQL 文に関連するすべての列が含まれている場合、Tablestore は、データクエリにセカンダリインデックスを自動的に選択します。 WHERE 句のプライマリキー条件は、左端一致の原則に従います。

    たとえば、データテーブルのプライマリキー列が a と b で、データテーブルに作成されたセカンダリインデックスのプライマリキー列が c、a、および b であるとします。クエリ条件が c = 1 and a > 1 の場合、セカンダリインデックスには条件で指定されたプライマリキー列が 2 つ含まれており、データテーブルには条件で指定されたプライマリキー列が 1 つ含まれています。この場合、Tablestore はデータクエリにセカンダリインデックスを自動的に選択します。

  3. データテーブルまたはセカンダリインデックスの自動選択: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); --アクセスするセカンダリインデックスを明示的に指定します。

セカンダリインデックスに作成されたマッピングテーブルを使用する

セカンダリインデックスを使用してデータをクエリする場合、次の手順を実行して、セカンダリインデックスに作成されたマッピングテーブルをデータクエリに使用できます。

説明

セカンダリインデックスに作成されたマッピングテーブルを使用してデータをクエリする場合、セカンダリインデックスに含まれるデータ列のみをクエリできます。

  1. CREATE TABLE 文を実行して、セカンダリインデックスのマッピングテーブルを作成します。詳細については、「テーブルにマッピングテーブルを作成する」をご参照ください。

  2. SELECT 文を実行して、セカンダリインデックスに作成されたマッピングテーブルを使用してデータをクエリします。詳細については、「データをクエリする」をご参照ください。

サーチインデックスに作成されたマッピングテーブルを使用する

サーチインデックスを使用してデータをクエリする場合、次の手順を実行して、サーチインデックスに作成されたマッピングテーブルをデータクエリに使用できます。

説明

サーチインデックスに作成されたマッピングテーブルを使用してデータをクエリする場合、サーチインデックスに含まれるデータ列のみをクエリできます。

  1. CREATE TABLE 文を実行して、サーチインデックスのマッピングテーブルを作成します。詳細については、「テーブルにマッピングテーブルを作成する」をご参照ください。

  2. SELECT 文を実行して、サーチインデックスに作成されたマッピングテーブルを使用してデータをクエリします。詳細については、「データをクエリする」をご参照ください。

付録:サーチインデックスの機能と SQL 式のマッピング

サーチインデックスは、SQL 式と同じ機能を提供します。次の表に、サーチインデックスの機能と SQL 式のマッピングを示します。

SQL 式

サーチインデックスの機能

述語なし

該当なし

すべて一致クエリ

=

  • a = 1

  • b = "hello world"

用語クエリ

>

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 クエリを高速化する場合は、サーチインデックスに基づいて機能を使用できます。これらの機能には、全文検索サーチインデックスの配列型サーチインデックスのネスト型、およびサーチインデックスの仮想カラム が含まれます。