0

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

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

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

4

2 回答 2

0

编辑。要回答您标题中的问题,简而言之,如果没有一些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 终于支持空间索引时,这将是一个好日子,它已经等待了很多年。

于 2014-08-11T21:36:23.017 回答
0

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

于 2014-08-11T09:59:00.810 回答