Php 查询lat、long和db,并显示范围内的所有记录

Php 查询lat、long和db,并显示范围内的所有记录,php,mysql,Php,Mysql,我正在工作的程序存储所有用户的纬度和经度(使用mysql和php) 我需要查询并显示100公里范围内的用户列表 我被以下问题困住了 Db设计以获得更快的结果。我的数据库结构好吗?如果我想更快的输出将指数的横向和长期工作?在下面的例子中,我应该使用Innodb或myisam引擎吗。如果我们有数十万条记录,在上述情况下查询结果将花费大量时间 我的sql表结构: id(int 11 primary key auto increment) | lat(varchar) | long(varchar)

我正在工作的程序存储所有用户的纬度和经度(使用mysql和php)

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

我被以下问题困住了

  • Db设计以获得更快的结果。我的数据库结构好吗?如果我想更快的输出将指数的横向和长期工作?在下面的例子中,我应该使用Innodb或myisam引擎吗。如果我们有数十万条记录,在上述情况下查询结果将花费大量时间
  • 我的sql表结构:

    id(int 11 primary key auto increment) | lat(varchar) | long(varchar)
    
  • 是否有直接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;
    
    选择id,(3959*acos(cos(弧度(37))*cos(弧度(纬度))*cos(弧度(lng)-弧度(-122))+sin(弧度(37))*sin(弧度(纬度)))作为距离
    从标记
    距离小于25的
    按距离限值0、20排序;
    
    如果使用MySQL>=5.6.1,则可以使用函数
    st_distance
    ,请参阅


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

    我不知道我在寻找什么,你需要养成这样的习惯,它可以帮助你解决问题。您将获得积分,其他人将被鼓励帮助您……更不用说尝试一些东西,并用一些您发现但有问题的代码为自己解决问题。嘿,请阅读问题并检查答案,我可以通过lat longI have,并且没有任何代码供任何人使用,因此它仍然不清楚,范围太广。在搜索引擎上和/或在堆栈中查找与您想要实现的目标相关的内容。在那之前,这是一个“为我写这个”类型的问题,有太多可能的答案。祝你好运。