代码之家  ›  专栏  ›  技术社区  ›  hsz

如何利用经纬度计算距离优化SQL查询?

  •  3
  • hsz  · 技术社区  · 14 年前

    table name: shop
    
    id_shop      int(10)
    name         varchar(200)
    latitude     double
    longitude    double
    

    我想计算给定坐标和保存在数据库中的坐标之间的距离。

    我当前的查询:

    SELECT *
      FROM `shop` AS `s`
     WHERE
          (
            ( 6371
            * ACOS(
                SIN( RADIANS( latitude ) )
              * SIN( RADIANS( 53.5353010379 ) )
              + COS( RADIANS( latitude ) )
              * COS( RADIANS( 53.5353010379 ) )
              * COS( RADIANS( 14.7984442616 ) - RADIANS( longitude ) )
              )
            )
            <= 25
          )
    

    JOIN LEFT

    有没有办法优化这个查询? 对于连接,大约需要13毫秒。

    我需要在这里补充一些 LIMIT COUNT(*)

    2 回复  |  直到 14 年前
        1
  •  5
  •   tvanfosson    14 年前

    这里有一些想法,其中一些可能不适用取决于你的具体情况。

    1. 您可以将经纬度转换为弧度,并将其存储在行中。这将节省这些计算的成本(实际上,在存储数据时,成本将累积一次)。
    2. 如果表中有其他数据可以作为良好的第一个过滤器(国家/地区/等),可以先应用它。
        2
  •  5
  •   Matt Gibson    14 年前

    当您第一次填充行时,也可以通过存储SIN(弧度(纬度))和COS(弧度(纬度))来刮去更多的信息。。。