深入浅出空间索引:为什么需要空间索引

一、问题

  先思考个常见的问题:如何根据自己所在位置查询来查询附近50米的POI(point of interest,比如商家、景点等)呢(图1a)?

  每个POI都有经纬度信息,我用图1b的SQL语句在mySQL中建立了POI_spatial的表,其中lat和lng两个字段来代表纬度和经度。为后续分析方便起见,我人造了40万个POI数据。

 二、传统的解决思路

方法一:暴力方法

  该方法的思路很直接:计算位置与所有POI的距离,并保留距离小于50米的POI。

  插句题外话,计算经纬度之间的距离不能像求欧式距离那样平方开根号,因为地球是个不规整的球体(图2a),按最简单的完美球体假设,两点之间的距离函数应该如图2b所示。

   该方法的复杂度为:40万*距离函数。我们将球体距离函数写为mysql存储过程distance,之后我们执行查询操作(图3),发现花费了4.66秒。

该方法耗时的原因显而易见,执行了40万次复杂的距离计算函数。

方法二:矩形过滤方法

  该方法分为两部:

  a)先用矩形框过滤(图4a),判断一个点在矩形框内很简单,只要进行两次判断(LtMin<lat<LtMax; LnMin<lng<LnMax),落在矩形框内的POI个数为n(n<<40万);

  b)用球面距离公式计算位置与矩形框内n个POI的距离(图4b),并保留距离小于50米的POI

  矩形过滤方法的复杂度为:40万*矩形过滤函数 + n*距离函数(n<<40万)。

 

  根据这个思路我们执行SQl查询(图5)(注: 经度或纬度每隔0.001度,距离相差约100米,由此推算出矩形左下角和右上角坐标),发现过滤后正好剩下两个POI。

  此查询花费了0.36秒,相比于方法一查询时间大大降低,但是对于一次查询来说还是很长。时间长的原因在于遍历了40万次。

方法三:B树对经度或纬度建立索引

  方法二耗时的原因在于执行了遍历操作,为了不进行遍历,我们自然想到了索引。我们对纬度进行了B树索引。

  此方法包括三个步骤:

  a)通过B树快速找到某纬度范围的POI(图6a),个数为m(m<40万),复杂度为Log(40万)*过滤函数;

  b)在步骤a过滤得到的m个POI中查找某经度范围的POI(图6b),个数为n(n<m),复杂度为m*过滤函数;

  c) 用球面距离公式计算位置与步骤b得到的n个POI的距离(图6c),并保留距离小于50米的POI

 

  执行SQL查询(图7),发现时间已经大大降低,从方法2的0.36秒下降到0.01秒。

三、B树能索引空间数据吗?

  这时候有人会说了:“方法三效果如此好,能够满足我们附近POI查询问题啊,看来B树用来索引空间数据也是可以的嘛!”

  那么B树真的能够索引空间数据吗?

1)只能对经度或纬度索引(一维索引),与期望的不符

  我们期待的是快速找出落在某一空间范围的POI(如矩形)(图8a),而不是快速找出落在某纬度或经度范围的POI(图8b),想象一下,我要查询北京某区的POI,但是B树索引不仅给我找出了北京的,还有与北京同一维度的天津、大同、甚至国外城市的POI,当数据量很大时,效率很低。

2)当数据是多维,比如三维(x,y,z),B树怎么索引?

  比如z可能是高程值,也可能是时间。有人会说B树其实可以对多个字段进行索引,但这时需要指定优先级,形成一个组合字段,而空间数据在各个维度方向上不存在优先级,我们不能说纬度比经度更重要,也不能说纬度比高程更重要。

3)当空间数据不是点,而是线(道路、地铁、河流等),面(行政区边界、建筑物等),B树怎么索引?

  对于面来说,它由一系列首尾相连的经纬度坐标点组成,一个面可能有成百上千个坐标,这时数据库怎么存储,B树怎么索引,这些都是问题。

 

  既然传统的索引不能很好的索引空间数据,我们自然需要一种方法能对空间数据进行索引,即空间索引。

下节将对空间索引分类体系、原理、优缺点及数据库支持情况进行阐述(正在写)。

时间: 2024-10-31 05:48:37

深入浅出空间索引:为什么需要空间索引的相关文章

SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础

原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初子午线.计量单位.投影等相关理论知识,我们可以使用这些空间参照系统组件来定义一系列应用于地球空间上的几何图像来表示地理空间中的特定功能,表示着地球上一个一个特定的位置点. 本篇主要介绍地理空间索引的概念以及微软SQL Server 2008 R2中的空间索引的应用.   一.空间索引 空间索引是指依

Oracle Spatial 简介

oracle Oracle Spatial 简介:        首先,Oracle 支持自定义的数据类型,你可以用数组,结构体或者带有构造函数,功能函数的类来定义自己的对象类型.这样的对象类型可以用于属性列的数据类型,也可以用来创建对象表.而Oracle Spatial也正是基于此种特性所开发的一套空间数据处理系统.        Spatial 的自定义数据类型有很多,都在MDSYS方案下,经常使用的是SDO_GEOMETRY类型.SDO_GEOMETRY表示一个几何对象,可以是点.线.面.

RDS PostgreSQL\HDB PG 毫秒级海量时空数据透视 典型案例分享

标签 PostgreSQL , GIS , 时空数据 , 数据透视 , bitmapAnd , bitmapOr , multi-index , 分区 , brin , geohash cluster 背景 随着移动终端的普及,现在有越来越多的业务数据会包含空间数据,例如手机用户的FEED信息.物联网.车联网.气象传感器的数据.动物的溯源数据,一系列跟踪数据. 这些数据具备这几个维度的属性: 1.空间 2.时间 3.业务属性,例如温度.湿度.消费额.油耗.等. 数据透视是企业BI.分析师.运营非

我的MYSQL学习心得(九)

原文:我的MYSQL学习心得(九) 我的MYSQL学习心得(九)   我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL学习心得(五) 我的MYSQL学习心得(六) 我的MYSQL学习心得(七) 我的MYSQL学习心得(八)   这一篇<我的MYSQL学习心得(九)>将会讲解MYSQL的索引   索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型. 根据存

我的MYSQL学习心得(九) 索引

这一篇<我的MYSQL学习心得(九)>将会讲解MYSQL的索引   索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型. 根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节. 大多数存储引擎有更高的限制.MYSQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关: MYISAM和InnoDB存储引擎只支持BTREE索引:MEMORY和HEAP存储引擎可以支

MySQL索引介绍

索引由数据库表中一列或者多列组合而成,其作用是提高对表中数据的查询速度. 创建索引是指在某个表的一列或者多列上建立一个索引,用来提高对表的访问速度, 创建索引由三种方法:在创建表的时候创建,在已存在的表上创建和用alter table语句创建. 创建索引的基本语法格式: ASC参数表示升序排列,DESC参数表示降序排列. 一,在创建表的时候创建索引 1,  创建一个普通索引: 创建一个index1的表,在其id字段上建立索引: create table index1(id int,namevar

PostgreSQL 实时位置跟踪+轨迹分析系统实践 - 单机顶千亿轨迹/天

标签 PostgreSQL , PostGIS , 动态更新位置 , 轨迹跟踪 , 空间分析 , 时空分析 背景 随着移动设备的普及,越来越多的业务具备了时空属性,例如快递,试试跟踪包裹.快递员位置.例如实体,具备了空间属性. 例如餐饮配送,送货员位置属性.例如车辆,实时位置.等等. 其中两大需求包括: 1.对象位置实时跟踪,例如实时查询某个位点附近.或某个多边形区域内的送货员. 2.对象位置轨迹记录和分析.结合地图,分析轨迹,结合路由算法,预测.生成最佳路径等. DEMO 以快递配送为例,GP

PostgreSQL multipolygon 空间索引查询过滤精简优化 - IO,CPU放大优化

标签 PostgreSQL , PostGIS , 空间数据 , 多边形 , bound box , R-Tree , GiST , SP-GiST 背景 在PostgreSQL中,目前对于空间对象的索引,采用的是GiST索引方法,空间树结构如下,每个ENTRY都是一个BOX: 如果对象是多边形,那么在索引结构中,会存储这个多边形的bound box. 那么对于非box类型,一定是会出现空间放大的. 另一方面,如果输入条件是个多边形,那么同样会将这个多边形的BOUND BOX作为输入条件,根据查

HTAP数据库 PostgreSQL 场景与性能测试之 29 - (OLTP) 高并发空间位置更新(含空间索引)

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos