【问题标题】:How to store geographical locations with foreign keys?如何用外键存储地理位置?
【发布时间】:2014-08-11 08:14:55
【问题描述】:

目前我正在开发基于位置的应用程序。主要应用功能之一是根据搜索条件定位点,并从一个点定位给定范围内的点。

明显的选择是将纬度/经度存储为浮点数或整数,但我在 MySQL 中找到了空间数据类型并开始挖掘。不幸的是,如果我是正确的,MyISAM 仅支持不支持外键(我需要)的空间索引。

那么,什么会更好(更快) - 将 lat/lon 存储为普通数字或使用不带索引的 POINT 类型?

【问题讨论】:

  • 您确定要使用索引吗?
  • @sectus,根据定义,空间数据往往很大,因此空间索引有很大的不同。
  • @sectus:很遗憾,是的。拥有大量数据肯定会使表格变慢。
  • 也许您可以提供有关您的应用程序的更多上下文,例如您可能拥有多少行,您可能运行什么样的查询等。我试图根据您的问题回答根据您所面临问题的长期经验,但可能需要更多信息。
  • 您是否找到了解决此问题的方法并愿意与我们分享?

标签: php mysql gps geospatial opengis


【解决方案1】:

您可以改用四键。将 x 和 y 值转换为二进制,然后连接二进制。这些点沿着 z 曲线排序,也就是怪物曲线。它具有非常好的空间特性。您可以使用最重要的位来验证上限。

【讨论】:

  • 我认为空间索引不适用于这种方法。
  • @sectus、quadkeys 和 geohashes 是用于将二维坐标转换为一维坐标的机制,以便可以使用 B 树对其进行索引。
  • @JohnBarça ,目的是使用索引。 dev.mysql.com/doc/refman/5.5/en/using-spatial-indexes.html
  • @sectus,我很清楚这一事实,但他问“将纬度/经度存储为普通数字还是使用不带索引的 POINT 类型?”因为 InnoDB 不支持空间索引,而 MyISAM 不支持外键。这就是问题的症结所在。
  • @sectus。值得阅读关于 geohashing 的维基百科文章或 MongoDB 空间文档来回答这个问题——但是包含、相交和距离查询都可以编写为与 geohashes/quadkeys 一起使用(但它们不如 R-tree 高效,它MySQL 的空间索引使用)。但这不是 OP 的原始问题 :-)
【解决方案2】:

编辑。要回答您标题中的问题,简而言之,如果没有一些hacky(见下文),您将无法回答。然而,我今天在回答关于 MySQL 空间的另一个问题时遇到了这个问题,http://mysqlserverteam.com/innodb-spatial-indexes-in-5-7-4-lab-release/。我不知道它什么时候上线,但如果你能等那么久,你最终会在 MySQL 的同一个引擎中拥有外键和空间索引。进一步挖掘表明,实际上空间索引将在MySQL 5.7.5 中发布,这似乎是迫在眉睫,尽管它被标记为里程碑发布。

至于您的其他问题,这将取决于您的表大小,但是将纬度和经度的复合索引存储为浮点数将大大优于对非索引点的全表扫描,而不是琐碎的行数 - 遗憾的是,我不能给你确切的数字,但上次我在几百万行上尝试这个时,我们看到的是数量级。

编辑:虽然这回答了您最初的问题,但如上所述,Point 上的空间索引将大大优于 lat/lon 上的复合索引,并且允许您使用 MySQL 的空间函数。 但是,正如你所指出的,这只会在 MyISAM 中工作,所以如果你想要同时使用空间索引、几何类型和外键,你仍然会被卡住,直到 InnoDB 添加空间索引,这是在管道中,如上面的链接。

这里有一个建议:https://dba.stackexchange.com/questions/49307/spatial-index-on-an-innodb-table 关于将空间数据保存在 InnoDB 和 MyISAM 中,在 MyISAM 中进行空间搜索,然后加入共享键并查询 InnoDB 中的属性,但这似乎很笨拙且效率低下还有关于两个引擎之间的不同锁定行为以及如何大规模执行的问题。

InnoDB 终于支持空间索引了,这将是美好的一天,等待了很多年。

【讨论】:

  • @kiler129。我认为最终的答案是等到 MySQL 5.7.5,带有空间索引的 InnoDB。
猜你喜欢
  • 2016-03-13
  • 2012-08-11
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2019-05-03
  • 2011-10-03
  • 1970-01-01
  • 2020-03-20
相关资源
最近更新 更多