时空索引介绍

Lindorm Ganos时空服务扩展了云原生多模数据库 Lindorm原有的主键索引二级索引能力来提高时空查询速度。时空查询是指查询条件中包含空间列(经纬度坐标或Geometry类型的列)或者空间和时间组合列(经纬度坐标或Geometry类型的列+时间列)的查询。本文介绍时空索引的概念、分类和使用场景。

Z-ORDER索引

在创建主键索引或二级索引时,通过加入Z-ORDER索引函数来为空间列或者空间和时间组合列添加索引。Z-ORDER索引函数返回一个编码值(称为Z-ORDER编码或时空编码),该编码值作为主键索引或二级索引的一部分。因此,时空索引并不是一个独立的索引,而是内嵌到Lindorm主键索引或二级索引中来实现加速时空查询的需求。

Z-ORDER函数索引分类

Z-ORDER主键索引

Z-ORDER编码作为主键索引的组成部分,此时主键索引为Z-ORDER主键索引。例如:PRIMARY KEY(Z-ORDER(g))

Z-ORDER二级索引

Z-ORDER编码作为二级索引的组成部分,此时二级索引为Z-ORDER二级索引。例如:Z-ORDER(g)

创建Z-ORDER索引的方法请参见创建时空索引

Z-ORDER函数说明

Lindorm Ganos根据Z-ORDER索引函数的入参自动计算出不同的时空编码,Z-ORDER索引函数的类型和说明如下表。

说明

当两个空间对象在位置上足够相近时(厘米级别),Z-ORDER索引函数生成的时空编码可能相同。

类型

参数说明

适用场景

Z-ORDER(Point)或者Z-ORDER(X, Y)

  • 点类型的列

  • 由经度x列和纬度y列组成

为点数据创建索引,当查询条件包含空间范围时,可使用该索引进行加速。

Z-ORDER(Point, Time)或者Z-ORDER(X, Y, Time)

  • 由点类型的列和时间列组成

  • 由经度x列、纬度y列和时间列组成

为点数据和时间创建索引,当查询条件包含时间范围和空间范围时,可使用该索引进行加速。

Z-ORDER(LineString)或者Z-ORDER(Polygon)

  • 线类型的列

  • 面类型的列

为线或者面数据创建索引,当查询条件包含空间范围时,可使用该索引进行加速。

Z-ORDER(LineString, Time)或者Z-ORDER(Polygon, Time)

  • 由线类型的列和时间列组成

  • 由面类型的列和时间列组成

为线数据和时间、面数据和时间创建索引,当查询条件包含时间范围和空间范围时,可使用该索引进行加速。

网格二级索引

重要

2.6.5以上版本的宽表引擎支持网格二级索引功能。

在创建索引时,如果对Geometry(目前支持POLYGON、MULTIPOLYGON、LINESTRING、MULTILINESTRING)列使用了S2索引函数,宽表引擎会自动构建网格二级索引。使用网格二级索引可以实现基于网格的过滤和计算功能。

网格二级索引根据Google S2算法,将空间划分成均匀大小的网格(S2Cell),每个网格对应一个唯一ID(S2CellID)。每个网格都会与一个面或多个面相交,这些相交信息都会被记录在索引中。

S2索引函数说明

语法

输入几何对象和精度,计算几何对象覆盖到的该精度下的网格,并返回网格ID(S2CellID)的集合。创建网格索引的方法请参见创建时空索引

Set<Long> S2(String geomColumnName, int level)

参数说明

参数

说明

geomColumnName

面类型(POLYGON或MULTIPOLYGON)或线类型(LINESTRING或MULTILINESTRING)列的列名,该列存储的空间数据坐标需为WGS84坐标系坐标。

重要

仅宽表引擎2.6.7.5及以上版本,支持线类型(LINESTRING或MULTILINESTRING)。如果您的宽表引擎无法通过控制台进行升级,请联系Lindorm技术支持(钉钉号:s0s3eg3)。

level

S2网格精度,取值范围为[1,30]。

索引选择

Z-ORDER索引适用场景

Z-ORDER索引对空间点类型数据有较好的过滤效果,当查询条件涉及到对空间点位置关系判断时,您可以根据Z-ORDER函数的适用场景,选择适合的函数创建索引。Z-ORDER函数的适用场景,请参见Z-ORDER函数说明

以下是使用Z-ORDER索引的最佳实践场景:

  • 时空范围查询:查询过去某段时间内车辆在某个区域的行驶轨迹。具体实现,请参见时空服务轨迹处理实测

  • 周边查询:查询某位置附近一定距离内的车辆,返回车辆的实时位置。具体实现,请参见时空服务轨迹处理实测

  • 轨迹出入统计:统计出轨迹点出入某个区域的信息,包括:驶入时间、驶出时间、停留时长、轨迹数量等。具体实现,请参见时空服务-轨迹出入点统计

同时,Z-ORDER索引对线或面类型数据也有一定的过滤效果,可以支持简单的过滤查询,例如:

  • 对线类型:查询某位置附近一定距离内的道路,每条道路是一个LINESTRING或MULTILINESTRING。

  • 对面类型:查询落在某个范围内的商圈,每个商圈是一个POLYGON或MULTIPOLYGON。

网格二级索引适用场景

网格二级索引较Z-ORDER索引对线或面有更好的过滤效果。对于非聚合查询,使用网格二索引可有效过滤掉与查询条件不相关的网格内的数据,加速查询,例如:

  • 围栏监测:实时查询轨迹点落在哪些围栏内,可达到百万级围栏数据毫秒级返回结果。

  • 周边查询:实时查询某位置周边一定半径范围内的商区。

同时,网格索引可以随时更新存储统计数据,可基于网格进行快速聚合统计,例如:

  • 统计数量:以网格为单位统计商区数量、轨迹数量等。

  • 统计区域属性:以网格为单位统计植被覆盖率、交易量总和等指标。