我有一个关于地理距离的查询。查询非常快,在我的 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 秒,这是我想要的或接近它的运行时间
最佳答案
建议:
- 更好的性能来自于使用 MySql spatial functions 和索引
如果你不想用它
- 预先计算常量
Set A = cos(radians(-60.61384878636903))
cos 函数非常慢。 - 过滤您的示例数据。如果您的原点是
X,Y
你可以创建一个正方形X +- 5, Y +- 5
并在X,Y
上使用常规索引
关于mysql - 优化 sql 查询以提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36366710/