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

Lindorm:時空間インデックスの作成

最終更新日:Nov 28, 2025

時空間インデックスには、Z-ORDER インデックスと S2 セカンダリインデックスが含まれます。時空間インデックスを使用すると、時空間クエリの効率を向上させることができます。このトピックでは、2 種類の時空間インデックスの作成方法について説明し、例を示します。

Z-ORDER インデックス

Z-ORDER インデックスには、Z-ORDER プライマリキーインデックスと Z-ORDER セカンダリインデックスが含まれます。

使用上の違い

次の表に、Z-ORDER プライマリキーインデックスと Z-ORDER セカンダリインデックスの使用方法の違いを示します。

インデックスタイプ

複数の時空間列の作成

備考

Z-ORDER プライマリキーインデックス

複数の時空間列に対して Z-ORDER プライマリキーインデックスを作成できます。ただし、1 つの時空間列に対してのみ Z-ORDER プライマリキーインデックスを作成し、他の時空間列に対しては Z-ORDER セカンダリインデックスを作成することをお勧めします。

列の Z-ORDER プライマリキーインデックスは、時空間テーブルの作成時にのみ作成できます。テーブルの作成後、Z-ORDER プライマリキーインデックスを変更、追加、または削除することはできません。

Z-ORDER セカンダリインデックス

複数の時空間列に対して Z-ORDER セカンダリインデックスを作成できます。

時空間テーブルの作成時またはテーブルの作成後に、列の Z-ORDER セカンダリインデックスを作成できます。 Z-ORDER セカンダリインデックスは追加または削除できますが、変更することはできません。

Z-ORDER プライマリキーインデックスの作成

Z-ORDER 関数によって生成された時空間コードをプライマリキーインデックスの一部として使用する場合、プライマリキーインデックスは Z-ORDER プライマリキーインデックスです。次の例は、Z-ORDER プライマリキーインデックスを作成するために使用できる構文を示しています。

  • Z-ORDER インデックス関数を使用して、g 列の時空間コードを生成します。

    -- 主キーインデックスには Z-ORDER コードのみが含まれます。
    CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, PRIMARY KEY(Z-ORDER(g)));
    
    CREATE TABLE point_table(id INT, lon DOUBLE, lat DOUBLE, name VARCHAR, PRIMARY KEY(Z-ORDER(lon, lat)));
    
    -- 主キーインデックスには Z-ORDER コードと ID の組み合わせが含まれます。
    CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, PRIMARY KEY(Z-ORDER(g),id));
    
    CREATE TABLE point_table(id INT, lon DOUBLE, lat DOUBLE, name VARCHAR, PRIMARY KEY(Z-ORDER(lon, lat),id));
  • Z-ORDER インデックス関数を使用して、g 列と t 列の時空間コードを生成します。

    -- 主キーインデックスには Z-ORDER コードのみが含まれます。
    CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, t LONG, PRIMARY KEY(Z-ORDER(g,t)));
    
    CREATE TABLE point_table(id INT, lon DOUBLE, lat DOUBLE, name VARCHAR, t LONG, PRIMARY KEY(Z-ORDER(lon, lat, t)));
    
    
    -- 主キーインデックスには Z-ORDER コードと ID の組み合わせが含まれます。
    CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, t LONG, PRIMARY KEY(Z-ORDER(g,t),id));
    
    CREATE TABLE point_table(id INT, lon DOUBLE, lat DOUBLE, name VARCHAR, t LONG, PRIMARY KEY(Z-ORDER(lon, lat, t),id));

Z-ORDER セカンダリインデックスの作成

Z-ORDER 関数によって生成された時空間コードをセカンダリインデックスの一部として使用する場合、セカンダリインデックスは Z-ORDER セカンダリインデックスです。次の例は、Z-ORDER セカンダリインデックスを作成する方法を示しています。

  1. 時空間データを格納するベーステーブルを作成します。

    CREATE TABLE point_table1(id INT, g GEOMETRY(POINT), name VARCHAR, t LONG, PRIMARY KEY(id));
    
    CREATE TABLE point_table2(id INT, lon DOUBLE, lat DOUBLE, name VARCHAR, t LONG, PRIMARY KEY(id));
  2. プライマリテーブルのプロパティを設定します。MUTABILITY プロパティを MUTABLE_LATEST に、CONSISTENCY プロパティを strong に設定します。

    ALTER TABLE point_table1 SET 'MUTABILITY'='MUTABLE_LATEST', 'CONSISTENCY'='strong';
    
    ALTER TABLE point_table2 SET 'MUTABILITY'='MUTABLE_LATEST', 'CONSISTENCY'='strong';
  3. Z-ORDER セカンダリインデックスを作成します。

    • Z-ORDER インデックス関数を使用して、g 列の時空間コードを生成します。

      • 方法 1:データ冗長性なし。

        CREATE INDEX idx ON point_table1 (Z-ORDER(g));
        
        CREATE INDEX idx ON point_table2 (Z-ORDER(lon, lat));
      • 方法 2:include(g) を使用してデータ冗長性を持たせ、テーブルルックアップを回避します。

        CREATE INDEX idx ON point_table1 (Z-ORDER(g)) INCLUDE (g);
        
        CREATE INDEX idx ON point_table2 (Z-ORDER(lon, lat)) INCLUDE (lon, lat);
    • Z-ORDER インデックス関数を使用して、g 列と t 列の時空間コードを生成します。

      • 方法 1:データ冗長性なし。

        CREATE INDEX idx ON point_table1 (Z-ORDER(g,t));
        
        CREATE INDEX idx ON point_table2 (Z-ORDER(lon, lat, t));
      • 方法 2:include(g) を使用してデータ冗長性を持たせ、テーブルルックアップを回避します。

        CREATE INDEX idx ON point_table1 (Z-ORDER(g,t)) INCLUDE (g);
        
        CREATE INDEX idx ON point_table2 (Z-ORDER(lon, lat, t)) INCLUDE (g);

S2 セカンダリインデックス

WGS84 の POLYGON、MULTIPOLYGON、LINESTRING、または MULTILINESTRING データに対して S2 セカンダリインデックスを作成できます。これらのインデックスを使用して、データがカバーする S2 セルに基づいて、これらのタイプのデータをクエリできます。クエリに POLYGON または MULTIPOLYGON データの条件が含まれている場合、S2 セカンダリインデックスを使用してクエリを高速化できます。

重要

LINESTRING または MULTILINESTRING データは、LindormTable 2.6.7.5 以降のバージョンでのみサポートされています。コンソールで LindormTable をアップグレードできない場合は、テクニカルサポート(DingTalk ID:s0s3eg3)にお問い合わせください。

S2 セカンダリインデックスの作成

  1. POLYGON、MULTIPOLYGON、LINESTRING、または MULTILINESTRING データを格納するためのベーステーブルを作成します。POLYGON、MULTIPOLYGON、LINESTRING、または MULTILINESTRING データを格納する列は、次の方法で定義できます:

    • GEOMETRY(POLYGON) を使用して、POLYGON データを格納する列を定義します。

      CREATE TABLE test_table1 (id INT, g GEOMETRY(POLYGON), name VARCHAR, t LONG, PRIMARY KEY(id));
    • GEOMETRY(MULTIPOLYGON) を使用して、MULTIPOLYGON データを格納する列を定義します。

      CREATE TABLE test_table1 (id INT, g GEOMETRY(MULTIPOLYGON), name VARCHAR, t LONG, PRIMARY KEY(id));
    • GEOMETRY(LINESTRING) を使用して、LINESTRING データを格納する列を定義します。

      CREATE TABLE test_table1 (id INT, g GEOMETRY(LINESTRING), name VARCHAR, t LONG, PRIMARY KEY(id));
    • GEOMETRY(MULTILINESTRING) を使用して、MULTILINESTRING データを格納する列を定義します。

      CREATE TABLE test_table1 (id INT, g GEOMETRY(MULTILINESTRING), name VARCHAR, t LONG, PRIMARY KEY(id));
    • データ列の型を汎用 GEOMETRY 型に設定します。

      CREATE TABLE test_table1 (id INT, g GEOMETRY, name VARCHAR, t LONG, PRIMARY KEY(id));
  2. プライマリテーブルのプロパティを設定します。MUTABILITY プロパティを MUTABLE_LATEST に、CONSISTENCY プロパティを strong に設定します。

    ALTER TABLE test_table1 SET 'MUTABILITY'='MUTABLE_LATEST', 'CONSISTENCY'='strong';
  3. S2 インデックス関数を使用して、指定されたレベルで g 列のデータによってカバーされるセルを計算します。 S2 セカンダリインデックスは、POLYGON または MULTIPOLYGON データを格納する静的テーブルに対してのみ作成できます。デフォルトでは、インデックスは非同期で作成されます。次のステートメントは、S2 セカンダリインデックスを作成する方法の例を示しています。

    CREATE INDEX s2_idx ON test_table1 (s2(g, 10));

    結果の確認

    SHOW INDEX FROM test_table1; 文を実行して、インデックスが作成されたかどうかを確認します。

  4. インデックスを構築します。

    BUILD INDEX s2_idx ON test_table1;
    説明

    BUILD INDEX 文を実行して、すべてのデータがプライマリテーブルに書き込まれた後に既存データを同期します。BUILD INDEX 文の実行開始後にプライマリテーブルに追加されたデータは、インデックステーブルには同期されません。