优化这个非常慢的MySQL查询

时间:2016-11-15 09:50:52

标签: mysql sql

我对MYSQL查询和优化它们并不是特别了解,所以我需要一些帮助。我根据表格中的经度和纬度值查看国际城市表格,找到最近的10个城市。

我使用的查询如下:

SELECT City as city,
       SQRT(POW(69.1 * (Latitude - 51.5073509), 2) +
           POW(69.1 * (-0.1277583 - Longitude) * COS(Latitude / 57.3), 2)) AS distance
from `cities`
group by `City`
having distance < 50
order by `distance` asc
limit 10

(经度和纬度值显然是动态地放在我的代码中)

有时这可能需要大约3-4分钟的开发环境才能完成。

我是否在这里犯了任何经典错误,或者我是否应该使用更好的查询来检索此数据?

任何帮助都应该受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

假设City是唯一的,并且您正在滥用GROUP BY和HAVING以获得更清晰的代码

SELECT City as city,
       SQRT(POW(69.1 * (Latitude - 51.5073509), 2) +
           POW(69.1 * (-0.1277583 - Longitude) * COS(Latitude / 57.3), 2)) AS distance

from `cities`

where  SQRT(POW(69.1 * (Latitude - 51.5073509), 2) +
           POW(69.1 * (-0.1277583 - Longitude) * COS(Latitude / 57.3), 2))  < 50

order by `distance` asc

limit 10
  • 如果City是唯一的,则聚合在单行上完成 MySQL使用排序操作来实现GROUP BY 排序复杂度为O(n * log(n)),因此如果没有索引,这将导致GROUP BY的复杂性。
  • 如果City不是唯一的,那么HAVING CLAUSE中的过滤是在一个任意行上完成的,这肯定不是OP所期望的。

HAVING和WHERE都与过滤相关并且HAVING具有性能优势的情况是在聚合列上进行过滤,有一些繁重的计算,而GROUP BY操作会显着减少行数

select x,... from ... group by x having ... some heavy calculations on x ...