mysql - 优化 sql 查询以提高效率

标签 mysql database-performance query-performance

我有一个关于地理距离的查询。查询非常快,在我的 224 万行表中大约在 0.1175 秒内返回。但是,我只需要最短的距离,使用内置的 order by 太慢了。

有什么方法可以只跟踪运行的最小值并将其提供给我吗?

例如,如果我有这些结果:

city a - 45km
city b - 48km
city c - 12km 

我可以让它给我 12 公里,记住所有距离值都是计算出来的吗?

这是排序的查询:

SELECT 
City, 
( 
    6371 * 
    acos(
        cos(radians(-60.61384878636903)) * 
        cos(radians(st_x(location))) * 
        cos(radians(st_y(location)) - 
        radians(112.80061386895574)) + 
        sin(radians(-60.61384878636903)) * 
        sin(radians(st_x(location))))
    ) as distance 
FROM table_name 
HAVING distance <  5 
ORDER BY distance ASC LIMIT 1 

表结构如下:

id - int(12)
location - Point()
City - varchar(255) 

问题在于 order by flag 花费的时间太长,无法对数据进行排序并获得最低值。它能否保持最低运行量,然后在不对性能造成重大影响的情况下给我这个?

表格包含,

2227851 - rows
spatial index on location

如果我使用 order by,我得到的运行时间大约是 14 秒,如果我不使用 order by,我得到的时间是 0.1 秒,这是我想要的或接近它的运行时间

最佳答案

建议:

如果你不想用它

  • 预先计算常量 Set A = cos(radians(-60.61384878636903)) cos 函数非常慢。
  • 过滤您的示例数据。如果您的原点是 X,Y你可以创建一个正方形 X +- 5, Y +- 5并在 X,Y 上使用常规索引

关于mysql - 优化 sql 查询以提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36366710/

相关文章:

javascript - 显示单选按钮在 PHP/HTML 中无法正常工作

sql - Postgresql句子性能

php - 在 MySQL/PHP 中进行近似搜索匹配的最佳方法?

mysql - DROP TRIGGER 在 mysql 中如何工作?

mysql - 如何创建基于滑动日期窗口动态联合日期分区表的 VIEW

php - 如何在PHP中从MySQL当前 session 回显数据?

mysql - 重复更新时插入获取 "new"生成的 id

mysql - 表索引建议

sql-server - 为什么 Entity Framework 在简单地获取表行时会触发两个 SQL 查询?

postgresql - postgresql 中预计算用户定义函数