全部产品
Search
文档中心

云原生多模数据库 Lindorm:创建时空索引

更新时间:Jun 28, 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技术支持(钉钉号: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语句开始执行后如果主表有新增数据,不会被同步至索引表中。