如何通过按经度和纬度计算距离来优化SQL查询? [英] How to optimize SQL query with calculating distance by longitude and latitude?

查看:708
本文介绍了如何通过按经度和纬度计算距离来优化SQL查询?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a table with structure like that:

table name: shop

id_shop      int(10)
name         varchar(200)
latitude     double
longitude    double

我想计算给定坐标与数据库中保存的坐标之间的距离.

And I'd like to calculate distance between given coordinates and coordinates saved in database.

我当前的查询

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用于某些数据.

plus some JOIN LEFT's for some data.

有什么方法可以优化该查询? 进行连接大约需要13毫秒.

Is there any way to optimize that query ? With joins it takes about 13msec.

我还需要在此处添加一些LIMITCOUNT(*),用于分页的商店总数.

I need to add here also some LIMIT and COUNT(*) for total amount of shops for pagination.

推荐答案

以下是一些想法,根据您的实际情况,其中一些想法可能不适用.

Here's a few ideas, some of which may not apply depending on your exact situation.

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

这篇关于如何通过按经度和纬度计算距离来优化SQL查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆