時空間インデックスには、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 セカンダリインデックスを作成する方法を示しています。
時空間データを格納するベーステーブルを作成します。
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));プライマリテーブルのプロパティを設定します。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';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 セカンダリインデックスの作成
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));
プライマリテーブルのプロパティを設定します。MUTABILITY プロパティを
MUTABLE_LATESTに、CONSISTENCY プロパティをstrongに設定します。ALTER TABLE test_table1 SET 'MUTABILITY'='MUTABLE_LATEST', 'CONSISTENCY'='strong';S2 インデックス関数を使用して、指定されたレベルで g 列のデータによってカバーされるセルを計算します。 S2 セカンダリインデックスは、POLYGON または MULTIPOLYGON データを格納する静的テーブルに対してのみ作成できます。デフォルトでは、インデックスは非同期で作成されます。次のステートメントは、S2 セカンダリインデックスを作成する方法の例を示しています。
CREATE INDEX s2_idx ON test_table1 (s2(g, 10));結果の確認
SHOW INDEX FROM test_table1;文を実行して、インデックスが作成されたかどうかを確認します。インデックスを構築します。
BUILD INDEX s2_idx ON test_table1;説明BUILD INDEX文を実行して、すべてのデータがプライマリテーブルに書き込まれた後に既存データを同期します。BUILD INDEX文の実行開始後にプライマリテーブルに追加されたデータは、インデックステーブルには同期されません。