全部產品
Search
文件中心

Lindorm:建立時空索引

更新時間:Jul 06, 2024

時空索引包括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)));
    
    -- 主鍵索引包含Z-ORDER和ID的組合
    CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, PRIMARY KEY(Z-ORDER(g),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)));
    
    -- 主鍵索引包含Z-ORDER和ID的組合
    CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, t LONG, PRIMARY KEY(Z-ORDER(g,t),id));

建立Z-ORDER二級索引

時空編碼作為二級索引的組成部分,此時二級索引為時空二級索引。建立時空二級索引的樣本如下:

  1. 建立主表,用於儲存時空資料。

    CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, t LONG, PRIMARY KEY(id));
  2. 設定主表的屬性。需要將主表的寫入模式MUTABILITY設定為MUTABLE_LATEST,一致性CONSISTENCY設定為strong

    ALTER TABLE point_table SET 'MUTABILITY'='MUTABLE_LATEST', 'CONSISTENCY'='strong';
  3. 建立時空二級索引。

    • 使用Z-ORDER索引函數對g列進行時空編碼。

      • 方式一:不冗餘資料。

        CREATE INDEX idx ON point_table (Z-ORDER(g));
      • 方式二:採用include(g)進行資料冗餘,避免回表查詢。

        CREATE INDEX idx ON point_table (Z-ORDER(g)) INCLUDE (g);
    • 使用Z-ORDER索引函數對g列和t列進行時空編碼。

      • 方式一:不冗餘資料。

        CREATE INDEX idx ON point_table (Z-ORDER(g,t));
      • 方式二:採用include(g)進行資料冗餘,避免回表查詢。

        CREATE INDEX idx ON point_table (Z-ORDER(g,t)) INCLUDE (g);

網格二級索引

為WGS84座標系下的面類型(POLYGON或MULTIPOLYGON)或線類型(LINESTRING或MULTILINESTRING)資料建立網格二級索引,通過面覆蓋到的網格來實現對面資料的索引。當查詢條件包含對面的判斷條件時,可使用該索引進行加速。

重要

僅寬表引擎2.6.7.5及以上版本,支援線類型(LINESTRING或MULTILINESTRING)。如果您的寬表引擎無法通過控制台進行升級,請聯絡Lindorm支援人員(DingTalk號:s0s3eg3)。

建立網格二級索引

  1. 建立主表,用於儲存面資料或線資料。可以將面資料列或線資料列的類型定義為以下幾種:

    • 面資料列的類型定義為GEOMETRY(POLYGON)。

      CREATE TABLE test_table1 (id INT, g GEOMETRY(POLYGON), name VARCHAR, t LONG, PRIMARY KEY(id));
    • 面資料列的類型定義為GEOMETRY(MULTIPOLYGON)。

      CREATE TABLE test_table1 (id INT, g GEOMETRY(MULTIPOLYGON), name VARCHAR, t LONG, PRIMARY KEY(id));
    • 線資料列的類型定義為GEOMETRY(LINESTRING)。

      CREATE TABLE test_table1 (id INT, g GEOMETRY(LINESTRING), name VARCHAR, t LONG, PRIMARY KEY(id));
    • 線資料列的類型定義為GEOMETRY(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列計算指定精度下覆蓋的網格。目前只針對靜態面類型表,預設採用非同步建立模式,範例程式碼如下:

    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語句開始執行後如果主表有新增資料,不會被同步至索引表中。