如何通过按经度和纬度计算距离来优化SQL查询? [英] How to optimize SQL query with calculating distance by longitude and latitude?
本文介绍了如何通过按经度和纬度计算距离来优化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.
我还需要在此处添加一些LIMIT
和COUNT(*)
,用于分页的商店总数.
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.
- 您可以将纬度和经度转换为弧度,并将其存储在行中.这样可以节省这些计算的成本(实际上,在存储数据时,成本应累计一次).
- 如果表很大,则可以使用简单的线性距离计算而不是Haversince公式来限制应用Haversince公式的结果.
- 如果表中还有其他数据可以用作良好的第一个过滤器(国家/地区/等),则可以先应用.
- 您可以重新排序联接,以便在距离过滤器之后应用联接,这样就不会为不合格的数据招致联接的费用.
这篇关于如何通过按经度和纬度计算距离来优化SQL查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文