通常,数据库会通过时空索引来管理时空数据,而在硬件资源固定的情况下,时空索引的好坏和使用方法会影响系统性能。例如,带有PostGIS插件的PostgresSQL利用GIST索引管理时空数据,但是GIST的效率在海量数据的场景下会极大的下降;具有高可扩展性的HBase等分布式数据库能支持海量数据的存储,但它们没有直接集成管理时空数据的索引。为此,GeoMesa提供了大量的时空索引工具方便HBase管理时空数据。但是,它支持的时空类型不够全面,并且在有些场景下,如时间跨度很大的查询场景,GeoMesa提供的索引效率都很低。
因此,我们提出了JUST时空数据引擎。它在采用GeoMesa提供的四种时空索引Z2、Z3、XZ2、XZ3的基础上,还自研了三种时空索引Z2T、XZ2T、time_range,以解决在特定场景下索引效率低的问题。此外,由于时空数据通常会包含ID等其他非时空属性,所以JUST还提供了适用于非时空属性的id索引、属性索引以及属性的二级索引。
•
Z2、Z3、Z2T索引:用于支持点对象的空间范围查询和时空范围,它们要求对象必须有点对象。
•
XZ2、XZ3、XZ2T索引:支持非点对象的空间范围查询和时空范围查询,它们要求对象必须有非点对象。点对象即指点。非点对象则包含线、面和网三种对象,它们具有不确定的空间形状。因此大部分空间索引都利用能包含它们最小的矩形边界来近似表达它们,再通过如R-Tree、XZ2等空间索引来进行管理。但是R-Tree不适用于分布式场景,因为JUST只提供了XZ2、XZ3、XZ2T三种适用于分布式场景的索引。
•
date索引:为时间点建立索引,它们要求对象必须为时间点对象,它可以加快时间等值查询和时间范围查询。
•
time_range索引为时间段索引,它们要求对象必须时间段对象,它可以加快时间段范围查询。
•
id和attr索引:它们可对非时空属性建立索引。如id索引可以加快id属性的等值、大于、小于等查询,attr可以加快属性的等值、大于、小于等查询。此外,attr索引还支持二级索引,它可以加快属性+时空的条件查询
为方便读者快速理解,以下的表4.3.1和表4.3.2总结了索引和基础对象的对应关系,表4.3.3总结了索引可以加快的查询场景。
索引 |
支持对象 |
Z2 |
具有几何类型Point的对象 |
Z3 |
具有几何类型Point和时间属性的对象 |
Z2T |
具有几何类型Point和时间属性的对象 |
XZ2 |
具有非点几何形状的对象 |
XZ3 |
具有非点几何形状和时间的对象 |
XZ2T |
具有非点几何形状和时间的对象 |
date |
具有时间属性的对象 |
time_range |
具有时间段属性(必须有开始时间,结束时间)的对象 |
id |
具有id属性对象 |
attr |
具有属性的对象,并且支持二级时空索引(用于时空过滤)。 |
表4.3.1 索引表及支持对象
对象 |
支持时空索引 |
点对象 |
Z2 |
带有时间属性的点对象 |
Z2,Z3,Z2T,
date,time_range |
非点对象 |
XZ2 |
带有时间属性的非点对象 |
XZ2,XZ3,XZ2T,date,time_range |
时间点对象 |
date |
时间段(开始时间,结束时间)对象 |
time_range |
表4.3.2支持索引
索引 |
支持查询 |
Z2 |
点空间范围查询 |
Z3 |
点时空范围查询 |
Z2T |
点时空范围查询 |
XZ2 |
非点空间范围查询 |
XZ3 |
非点时空范围查询 |
XZ2T |
非点时空范围查询 |
date |
时间范围查询 |
time_range |
时间段查询 |
id |
id查询 |
attr |
属性查询,属性+时空查询 |
表4.3.3 支持查询