什么是空间索引,我应该什么时候使用它?

Posted

技术标签:

【中文标题】什么是空间索引,我应该什么时候使用它?【英文标题】:What is a SPATIAL INDEX and when should I use it? 【发布时间】:2011-01-16 09:57:44 【问题描述】:

像大多数普通的 php Web 开发人员一样,我使用 mysql 作为 RDBMS。 MySql(也和其他 RDBMS 一样)提供了 SPATIAL INDEX 功能,但我不太了解。我用谷歌搜索了它,但没有找到明确的现实世界例子来澄清我对它的坏了解。

有人能解释一下什么是空间索引,什么时候应该使用它?

【问题讨论】:

demian,这回答了你的问题吗?如果您需要更多帮助,请随时在我的答案中添加评论。或者,如果这为您解决了问题,请您将我的答案视为“答案”。 TIA,罗兰。 MySQL官方文档给出了解释和示例:Creating Spatial Indexes - Using a Spatial Index 【参考方案1】:

您可以使用空间索引来索引地理对象 - 形状。空间索引使得高效搜索空间重叠的对象成为可能

【讨论】:

虽然非常具体 Creating High Performance Spatial Databases 是一个很棒的视频,可以帮助您了解空间索引与其他索引有何不同。 只是好奇,因为空间索引是二维的,我可以在其他用例中利用它们吗,比如对常规内部数据的范围查询? @MangatRaiModi 如果只是常规整数数据,那么使用普通的 btree 索引可能会更好。那些支持范围查询。【参考方案2】:

空间索引就像一个普通索引,不同之处在于空间对象不是一维数据点,而是在更高维空间(例如二维)中,因此普通索引(如 BTree)不适合索引此类数据。著名的空间索引技术是 R-tree(在 wikipedia 上谷歌)

【讨论】:

【参考方案3】:

空间索引的使用最好用于精确匹配值查找,而不是范围扫描。主要在MyISAM表中支持,但从MySQL 5.7.4 LAB版本开始,Innodb也支持。

参考资料:- http://dev.mysql.com/doc/refman/5.5/en/creating-spatial-indexes.html http://mysqlserverteam.com/innodb-spatial-indexes-in-5-7-4-lab-release/

【讨论】:

首先它被称为空间索引。其次,您关于它不适用于范围扫描的评论适用于 btree 上的非空间索引,因此它不是在谈论那里的空间索引 - “对于支持空间列的非空间索引的存储引擎,引擎会创建一个 B-tree 索引. 空间值的 B-tree 索引对于精确值查找很有用,但对于范围扫描无效。"【参考方案4】:

当我们需要存储一些地理数据来存储位置或者我们需要存储与形状相关的数据时,我们可以使用它。

例如,假设您正在尝试开发一个应用程序来帮助人们找到他们附近的餐馆、酒馆、酒吧和其他聚会场所。简而言之,这将是一个位置发现平台。

从后端的角度来看,我们需要存储这些位置的地理数据,例如纬度和经度。然后我们需要编写函数来计算用户和位置之间的距离(显示位置离他/她有多远)。使用相同的函数,我们可以设计一种算法,找到离用户最近的地方或在他/她的给定半径内。

您可能会在这里找到更好的示例:- https://medium.com/sysf/playing-with-geometry-spatial-data-type-in-mysql-645b83880331

【讨论】:

以上是关于什么是空间索引,我应该什么时候使用它?的主要内容,如果未能解决你的问题,请参考以下文章

postgres 空间索引

ORACLE11g 反复插数据删数据,删索引建索引,对数据文件和表空间有啥影响

在Oracle数据库中按用户名重建索引的方法

什么时候应该使用 Oracle 的索引组织表?或者,我什么时候不应该?

未使用空间索引

Mysql空间索引