Android 使用还是不使用反向地理编码来索引一个具有约500000行的MySQL表?

Android 使用还是不使用反向地理编码来索引一个具有约500000行的MySQL表?,android,mysql,sql,geolocation,geocoding,Android,Mysql,Sql,Geolocation,Geocoding,我有一个大约5000行的表格,其中包含地标的地理坐标(纬度+经度)和位置信息(城市、州和国家)。我使用此表检索距离用户位置最近的位置(例如附近的公园等) 就目前而言,我正在通过对用户的gps坐标进行反向编码来过滤查询,以获得他的城市、州和国家(我正在使用Android的地理编码器)。然而,我逐渐意识到地理编码器偶尔会失败一次,因此我的云服务器上的SQL查询不会返回任何结果 所以我想跳过反向编码,确保每次都能得到好的结果。我会用土心酸盐来得到我想要的,就像这样: SELECT p.placeId,

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

就目前而言,我正在通过对用户的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

然而,我的桌子每天都在增加,最终可能会增加到50万张。您是否认为当我的表扩展到该大小时,对每行执行距离计算可能会成为性能问题?或者500000行的表不是问题吗?

是的。您可以使用空间索引。例如,Mssql使用空间填充曲线。该曲线降低了维数,不与自身相交,保留了一些原始的局部信息。曲线通常用于贴图应用。请在nick的空间四叉树hilbert曲线博客上阅读。我写了一篇关于lat-lng对的hilbert曲线搜索,速度非常快。可以使用带有4个字母的字符串,而不是数字来索引位置。然后可以从左到右搜索字符串中的位置。当然,您可以将索引反转为lat lng并返回

您可以将搜索范围限制为所需的半径和记录数。在这种情况下,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
选择地点ID、名称、纬度、液化天然气、,
(3959*acos(弧度($user_纬度))*cos(弧度(纬度))
*cos(弧度(lng)-弧度($user_经度))+sin(弧度($user_经度))
*sin(弧度(lat)))表示距离myTable的距离小于25
按距离限制0、20订购
这个查询在一个500000行的MySQL数据库上运行了2.08秒


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

如果出现问题,您可以使用WHERE子句限制查询,该子句只选择(Lat-X,Lon-X):(Lat+X,Lon+X)内的记录,其中X是一个粗略的预定值,表示您首先要搜索的距离。例如,当你在加利福尼亚时,在佛罗里达州按距离计算和订购加油站就没有多大意义