是否在MySQL中设置用户空间点列以提高性能

是否在MySQL中设置用户空间点列以提高性能,mysql,sql,geolocation,spatial,Mysql,Sql,Geolocation,Spatial,我在应用程序中使用MySQL存储城市列表。 每个长/纬度代表城市的中心 我希望能够将所有靠近某个特定城市的城市拉到X公里的距离 我的问题是,为了实现这一目标,什么会表现得更快 使用点列,并使用空间查询检索数据? 或 使用浮动经度列和浮动纬度列。然后使用java代码生成long/lat-between距离,然后再对这些值运行SQL WHERE-between查询。 我还有一个小问题,要求所有离纽约10公里的城市都去,这有意义吗。当纽约范围可能大于10公里时?您可以使用查询数据库 name Varc

我在应用程序中使用MySQL存储城市列表。 每个长/纬度代表城市的中心

我希望能够将所有靠近某个特定城市的城市拉到X公里的距离

我的问题是,为了实现这一目标,什么会表现得更快

使用点列,并使用空间查询检索数据? 或

使用浮动经度列和浮动纬度列。然后使用java代码生成long/lat-between距离,然后再对这些值运行SQL WHERE-between查询。 我还有一个小问题,要求所有离纽约10公里的城市都去,这有意义吗。当纽约范围可能大于10公里时?

您可以使用查询数据库

name Varchar(50) 
lat Decimal(9,6)
lng Decimal(9,6) 
下面的查询使用PDO


在这种情况下,空间扩展总是会更好,因为它基于R树索引,该索引针对N维空间中的范围搜索进行了优化


而原生mysql索引是B-树,在最好的情况下,只有索引中的一个字段用于范围比较,或者如果您使用其他答案中的一些高级地理公式,则根本不使用索引。

空间扩展总是比中间快,因为它使用R-树索引,虽然mysql的原生版本是B-Treedose,但我有理由要求所有距离纽约10公里的城市。当纽约范围可能大于10公里时,这取决于你如何定义纽约。有什么特别的问题吗?多边形?对于非常近的城市,这可能会有点效果。然而,由于我们不是在二维平面上,而是在一个球体上,结果会离得很近,离得更远。@zerkms我把纽约也定义为一个点,我没有世界上所有城市的愤怒信息,没有人提供这些信息。我不确定我是否需要这些信息。。。这是我要的feedback@zerkms你能给我一个答案,这样我就可以把你的答案标记为正确的吗?对于任何超过10万排的人来说,这几乎是不可接受的。谢谢,但是提到的方法中,哪一种最好implement@shayte存储坐标小数点9,6。十进制是精确的,浮点是近似的@davidstrachan谢谢我刚刚学到了一些新东西:-,但是空间点列会发生什么呢?@shayte查询使用MySQL而不使用空间扩展。正如您所看到的,对于457K行数据库,查询在<2秒的速度下运行,没有索引;“3173959”赛艇在0.016秒后返回:-@shay te:0.016秒“3173959”赛艇令人印象深刻
name Varchar(50) 
lat Decimal(9,6)
lng Decimal(9,6)