1

我有一个包含大约 5,000 行的表,其中包含地标上的地理坐标(纬度+经度)和位置信息(城市、州和国家/地区)。我使用这个表来检索离用户位置最近的位置(例如附近的公园等)。

至于现在,我通过对用户的 gps 坐标进行反向编码来过滤查询,以获得他的城市、州和国家(我正在使用 Android 的地理编码器)。但是,我开始意识到地理编码器偶尔会失败,因此我的云服务器上的 SQL 查询不会返回任何结果。

因此,我正在考虑跳过反向编码以确保每次都能获得良好的结果。我将只使用地理坐标来获得我想要的东西,如下所示:

SELECT p.placeId, p.name,( 6371 * acos( cos( radians($latitude) ) * cos( radians( p.latitude ) ) * cos( radians( p.longitude ) - radians($user_longitude) ) + sin( radians($user_latitude) ) * sin( radians( p.latitude  ) ) ) ) AS distance ORDER BY distance

但是,我的桌子每天都在增加,最终可能会增长到 500,000。您是否认为当我的表扩展到该大小时,对每一行执行距离计算可能会成为性能问题?或者 500,000 行的表真的不是问题吗?

4

2 回答 2

1

是的。您可以使用空间索引。例如,Mssql 使用空间填充曲线。曲线减小了维度,不与自身相交并保留了一些原始位置信息。曲线常用于制图应用。在 nick 的空间四叉树希尔伯特曲线博客中了解它。我写了一个希尔伯特曲线搜索 lat lng 对,它非常快。您可以使用包含 4 个字母的字符串来代替数字来索引位置。然后您可以从左到右搜索字符串中的位置。当然,您可以将索引反转为 lat-lng 并返回。

于 2013-02-06T23:38:58.737 回答
1

您可以将搜索限制在所需的范围和记录数内。在这种情况下,25 公里和 20 条记录。

SELECT  placeId, name, lat, lng,
( 3959 * acos( cos( radians($user_latitude) ) * cos( radians( lat ) ) 
* cos( radians( lng ) - radians($user_longitude)) + sin( radians($user_latitude))
* sin( radians( lat ) ) ) ) AS distance FROM myTable HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20

此查询在 500,000 行 MySQL 数据库上运行耗时 2.08 秒。

建议将PDO与准备好的语句一起使用

于 2013-02-07T16:39:02.920 回答