从数据库查询lat,long并显示范围内的所有记录


Querying lat , long from db and show all records with in range

我正在开发程序,存储所有用户的纬度和经度(使用mysql和php)。

我需要查询并显示100公里范围内的用户列表。

我被以下问题困扰

  1. Db设计以获得更快的结果。我的数据库结构好吗?如果我想要更快的输出,会对lat和long工作进行索引吗?在以下情况下,我应该使用Innodb或myisam引擎吗。如果我们有几十万条记录,在上述情况下查询结果将花费大量时间

我的sql表结构:

id(int 11 primary key auto increment) | lat(varchar) | long(varchar)
  1. 是否有直接的sql函数或代码可以获取指定范围内的所有用户?我在谷歌上搜索了一下,发现他们中的大多数人都在使用cos。这是唯一的办法吗

提供输出但速度较慢的查询:

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance 
FROM markers 
HAVING distance < 25 
ORDER BY distance LIMIT 0, 20;

如果您使用MySQL>=5.6.1,您可以使用函数st_distance,请参阅http://dev.mysql.com/doc/refman/5.6/en/spatial-relation-functions-object-shapes.html#function_st-距离

它要求使用POINT作为坐标的类型。