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

Php 如何使用外键存储地理位置?,php,mysql,gps,geospatial,opengis,Php,Mysql,Gps,Geospatial,Opengis,目前我正在开发基于位置的应用程序。主要应用功能之一是根据搜索条件定位点,并从一个点定位给定范围内的点 明显的选择是将lat/lon存储为浮点数或整数,但我在MySQL中找到了空间数据类型并开始挖掘。不幸的是,如果我正确的话,MyISAM只支持空间索引,而MyISAM不支持我需要的外键 那么,什么会更好更快呢?将lat/lon存储为普通数字还是使用不带索引的点类型?您可以使用四键代替。将x和y值转换为二进制文件,然后连接二进制文件。这些点沿着z曲线排序,也就是怪物曲线。它具有很好的空间特性。您可以

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

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


那么,什么会更好更快呢?将lat/lon存储为普通数字还是使用不带索引的点类型?

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

编辑。要回答标题中的问题,简而言之,如果没有一些黑客,你不能,见下文。然而,今天我在回答关于MySQL spatial的另一个问题时遇到了这个问题。我不知道它什么时候上线,但是如果你能等那么久,你最终会在MySQL的同一个引擎中拥有外键和空间索引。进一步挖掘表明,事实上,空间索引将被发布,这似乎是迫在眉睫的,尽管它被标记为里程碑式的发布

至于你的另一个问题,这将取决于你的表大小,但将纬度和经度的复合索引存储为浮点数将大大优于对非索引点的完整表扫描,而不仅仅是琐碎的行数-遗憾的是,我无法给出确切的数字,但上次我在数百万行上尝试了这一点,我们在看数量级

编辑:正如前面所述,虽然这回答了您最初的问题,但Point上的空间索引将远远优于lat/lon上的复合索引,并且允许您使用MySQL的空间函数。但是,正如您所指出的,这只在MyISAM中起作用,因此如果您同时需要空间索引、几何体类型和外键,那么您仍然会陷入困境,直到InnoDB添加空间索引为止,正如上面链接中所述,空间索引正在进行中

这里有一个建议:在InnoDB和MyISAM中保存空间数据,在MyISAM中进行空间搜索,然后加入共享密钥并在InnoDB中查询属性,但是这看起来非常粗糙和低效,而且关于两个引擎之间不同的锁定行为以及这在规模上的表现也存在疑问


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

你确定会使用索引吗?@sectus,空间数据从定义上来说往往很大,因此空间索引会产生巨大的影响。@sectus:不幸的是,是的。拥有大量数据肯定会使table变慢。也许您可以提供更多关于您的应用程序的上下文,例如您可能有多少行,您可能会运行什么类型的查询,等等。基于您所面临问题的长期经验,我尝试回答您的问题,但是可能需要更多的信息。你找到解决这个问题的方法了吗?我认为空间索引不适合这种方法。@sectus、quadkeys和GeoHash是将二维坐标转换为一维坐标的机制,这样就可以使用B树对它们进行索引。@JohnBarça,目的是使用索引@sectus,我很清楚这一事实,但他要求将lat/lon存储为正常数,还是使用不带索引的点类型?因为InnoDB不支持空间索引,MyISAM不支持外键。这是问题的症结所在。值得阅读维基百科关于geohashing的文章或MongoDB spatial docs来回答这个问题——但是包含、交叉和距离查询都可以编写为使用Geohash/quadkeys,但它们不如MySQL的空间索引使用的R树高效。但这不是OP最初的问题:-@kiler129。我认为最终的答案是等到MySQL 5.7.5,InnoDB和空间索引。