mysql - 优化这个非常慢的 MySQL 查询

标签 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 分钟才能完成。

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

如有任何帮助,我们将不胜感激。

最佳答案

假设 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 ...

关于mysql - 优化这个非常慢的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40606705/

相关文章:

mysql - 在一行中加入具有不同值的两行

mysql - 如何在 mySQL 中排除行对的聚合?

sql - 如何在ORACLE中一次更新所有列而不指定列名

php - MySQL 左连接查询具有相同值的问题

php - 写数据库时如何整合继承技术

sql - 无法绑定(bind)多部分标识符

mysql - GTID 复制错误

php - 使用 PHP 根据数据库条目突出显示表中的单元格

c# - 我如何在我的项目中解决初始化字符串的格式不符合从索引 17' 开始的规范

sql - Oracle Forms 11g - 将文件作为 PDF 而不是 TXT 通过电子邮件发送