小编典典

如何通过按经度和纬度计算距离来优化SQL查询?

sql

我有一个具有这样的结构的表:

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(*)用于分页的商店总数。


阅读 269

收藏
2021-03-23

共1个答案

小编典典

这里有一些想法,根据您的实际情况,其中一些想法可能不适用。

  1. 您可以将纬度和经度转换为弧度,并将其存储在行中。这将节省这些计算的成本(实际上,在存储数据时,成本应累计一次)。
  2. 如果表很大,则可以使用简单的线性距离计算,而不是Haversince公式来限制应用Haversince公式的结果。
  3. 如果表中还有其他数据可以用作良好的第一个过滤器(国家/地区/等),则可以首先应用它。
  4. 您可以对连接进行重新排序,以便在距离过滤器之后应用它们,这样就不会在不符合条件的数据上产生连接成本。
2021-03-23