如何使用外键存储地理位置?

时间:2014-08-11 08:14:56

标签: php mysql gps geospatial opengis

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

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

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

2 个答案:

答案 0 :(得分:0)

您可以使用四核来代替。将x和y值转换为二进制,然后连接二进制文件。这些点沿z曲线a.k.a怪物曲线排序。它具有非常好的空间特性。您可以使用最重要的位验证上限。

答案 1 :(得分:0)

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

至于你的另一个问题,这将取决于你的表大小,但是将纬度和经度的复合索引存储为浮点数将大大超过非索引点上的全表扫描,超出了琐碎的行数 - 遗憾的是我不能给你准确的数字,但上次我在几百万行上试过这个,我们看的是数量级。

编辑:虽然这回答了原始问题,如上所述,Point上的空间索引将远远优于lat / lon上的复合索引,并允许您使用MySQL的空间函数。 / strong>但是,正如您所指出的,这只适用于MyISAM,因此如果您想同时使用空间索引,几何类型和外键,您仍然会陷入困境,直到InnoDB添加了空间索引(在管道中),如上面的链接所述。

这里有一个建议:https://dba.stackexchange.com/questions/49307/spatial-index-on-an-innodb-table关于在InnoDB和MyISAM中保存空间数据,在MyISAM中进行空间搜索,然后加入共享密钥并查询InnoDB中的属性,但这看起来相当hacky并且效率低,并且对两个引擎之间的不同锁定行为也有疑问,以及这可能如何在规模上发挥作用。

这将是InnoDB最终支持空间索引的好日子,它已经等待多年了。